openfans.org-开源爱好者社区

最近c++程序写的比较多,发现以前设计的一些问题,原则是这样使用c++就不要使用c,因为c的文件不会被预编译,你必须在工程中c++页设置Not using。。。
因为没有预编译,有时候要引入windows.h文件。有一次写jni,一个从linux转过来的哥们,不会用c++,使用c程序,使用动态数组的技术,根据函数传来的参数,初始化数组的大小,当然不是static的,但是这个vc编译不过去,使用gcc编译,编译cpp我们用g++,还得在函数上写明extern "C"。
mingw还没有make,无法写mak文件, 全是手工编译连接,后来发现一个办法,c写的程序作为一个独立的工程,编译为.a lib文件,c++引用,vc的工程也是如此,cpp和c分开使用,mfc的cpp和其他cpp的文件也要分工程,这样用利于编译。
还有在cpp中少用c的语法,例如传递指针不如传递引用,否则你的代码就是指针和引用起飞,c和c++共天一色,使用stl就不必使用c的char数组。包含stdafx.h就自己包含windows.h和afx.h。
当 C 运行时 (CRT) 库和 Microsoft 基础类 (MFC) 库的链接顺序有误时,可能会出现以下 LNK2005 错误之一:
vc的crt的动态库是mscrt.dll,borland的bcb是borlandmm.dll,vc开始编译时(即生成makefile时),将源文件名按字母排序后,依次处理;一边编译一边决定需要哪些缺省库。 它的这些习惯有时会造成奇怪的编译错误,例如项目中有两个文件:
dateutil.c 使用c的函数
MYApp.cpp 使用了MFC的c函数。
编译器先处理dateutil.c,然后觉得需要link一个C Runtime库,根据项目设置选择了LIBCMTD.lib。
然后又处理MYApp.cpp,因为要用MFC,link nafxcwd.lib。
最后link的时候,就会出现以下冲突:
nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCMTD.lib(dbgdel.obj)
其实,如果先link nafxcwd.lib,再link LIBCMTD.lib,就不会产生冲突。
解决这类问题有两个办法。
1、将需要link C Runtime库的文件(dateutil.c)的名字改大一些,让它排在后面。
2、在settings->link->input的Objects/library modules中设置nafxcwd.lib LIBCMTD.lib,强制指定库的顺序。也可以顺利编译。
总结一下:在发生缺省库冲突时,可以通过手工设置缺省库的顺序来解决,正确的顺序应该是:
MFC库、CRT动态链接版本的导入库、CRT静态库。
CRT是C RunTime库的缩写。
微软的说法
原因
CRT 库对 new、delete 和 DllMain 函数使用弱外部链接。MFC 库也包含 new、delete 和 DllMain 函数。这些函数要求先链接 MFC 库,然后再链接 CRT 库。

回到顶端
解决方案
该问题有两种解决方法。第一种方法是强制链接器按照正确的顺序链接库。第二种方法是由您亲自查找导致问题的模块并纠正它。
注意:下列步骤基于 Visual C++ 6.0 进行。
回到顶端
解决方案一:强制链接器按照正确的顺序链接库1. 在“项目”菜单上,单击“设置”。
2. 在“项目设置”对话框的“以下项目的设置”视图中,单击以选中出现链接错误的项目配置。
3. 在“链接”选项卡上,单击以选中“类别”组合框中的“输入”。
4. 在“忽略库”框中,插入库名(例如,Nafxcwd.lib;Libcmtd.lib)。
注意:等效的链接器命令行是:/NOD: 。
5. 在“对象/库模块”框中,插入库名。必须确保这些库按顺序列出,而且是行中的前两个库(例如,Nafxcwd.lib 和 Libcmtd.lib)。
解决方案二:找到并纠正出现问题的模块
要查看当前的库链接顺序,请按照下列步骤操作: 1. 在“项目”菜单上,单击“设置”。
2. 在“项目设置”对话框的“以下项目的设置”视图中,单击以选中出现链接错误的项目配置。
3. 在“链接”选项卡上的“项目选项”框中键入 /verbose:lib。
4. 重新生成项目。在链接过程中,这些库将在输出窗口中列出。
使用 MFC 库时,务必先链接它们,然后再链接 CRT 库。这可以通过确保项目中的每个文件都首先包含 Msdev/Mfc/Include/Afx.h 来完成。直接包含 (#include ) 或间接包含 (#include ) 都可以。Afx.h 包含文件会通过使用 #pragma comment (lib," ") 指令来强制采用库的正确顺序。
如果源文件的扩展名为 .c,或者该文件的扩展名为 .cpp 但不使用 MFC,则可以创建一个较小的头文件 (Forcelib.h) 并将其放在模块的顶端。这个新的头文件可确保按照正确的顺序搜索库。
Visual C++ 不包含该头文件。要创建此文件,请按照下列步骤操作: 1. 打开 Msdev/Mfc/Include/Afx.h。
2. 选定 #ifndef _AFX_NOFORCE_LIBS 和 #endif //!_AFX_NOFORCE_LIBS 之间的行。
3. 将选定部分复制到 Windows 剪贴板。
4. 创建一个新文本文件。
5. 将剪贴板的内容粘贴到这个新文件中。
6. 将该文件另存为 Msdev/Mfc/Include/Forcelib.h。

回到顶端
在 Visual C++ .NET 中重现问题的步骤1. 启动 Microsoft Visual Studio .NET。
2. 在“文件”菜单上,指向“新建”,然后单击“项目”。
3. 单击“项目类型”下的“Visual C++ 项目”,然后单击“模板”下的“MFC 应用程序”。
4. 在“名称”文本框中,键入 Q148652。
5. 在“位置”文本框中,键入 C:/Test,然后单击“确定”。
6. 在“MFC 应用程序向导”对话框中,单击“应用程序类型”。
7. 单击“应用程序类型”下的“基于对话框”,然后单击“MFC 的使用”下的“在静态库中使用 MFC”。
8. 单击“完成”。
9. 在“解决方案资源管理器”中,选择“源文件”下的全部三个 .cpp 文件。
10. 右键单击三个选定的文件,然后单击“删除”。
11. 右键单击“源文件”,指向“添加”,然后单击“添加新项”。
12. 单击“模板”下的“C++ 文件”。在“名称”文本框中,键入 Aa。单击“打开”。
13. 将以下代码粘贴到 Aa.cpp 中:
int test(){new int; return 1;}
14. 右键单击“源文件”,指向“添加”,然后单击“添加现有项”。
15. 选择以下文件: • Q148652.cpp
• Q148652Dlg.cpp
• stdafx.cpp
16. 单击“打开”。
17. 您在第 15 步中选择的文件将出现在“源文件”下。
18. 选择“源文件”下的全部四个 .cpp 文件。
19. 右键单击选定的四个 .cpp 文件,然后单击“属性”。
20. 展开“配置属性”,然后展开“C/C++”。
21. 单击“预编译头”。
22. 将“创建/使用预编译头”属性设置为“不使用预编译头”。单击“确定”。
23. 在“生成”菜单上,单击“重新生成解决方案”

本文转自
http://cache.baidu.com/c?m=9d78d513d9d437a94f9be7690c66c0161c43f3632ba6db020ba78449e3732a4b5016e0ac56510777d0d27d1716df3d4b9df02173471450b68cbf8f5daccd85585f9f2644676df55662d00de88b182a9b66d618feae6afaa7b577d6b9d2a482160496075626c1e78b2d5c438c72ae4f70a5d2ca14542b47edbb4b23a8066029e87906e919eee1463254dea1ca5d3ac029d66a179cad31b03814bf15&p=8b2a9446bab150e41bb1c4710a1386&user=baidu
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了在OpenStack中配置Ceph,您需要在控制节点和计算节点上复制Ceph的配置文件/etc/ceph/ceph.conf。这是因为控制节点和计算节点都需要与Ceph通信。您可以使用以下命令将配置文件复制到OpenStack节点上: ``` ssh {your-openstack-server} sudo tee /etc/ceph/ceph.conf </etc/ceph/ceph.conf ``` 您还可以参考OpenStack官方文档的链接:http://docs.openfans.org/ceph/ceph4e2d658765876863/ceph-1/copy_of_ceph-block-device3010ceph57578bbe59073011/openstack301057578bbe59077684openstack3011#u,了解更多关于OpenStack配置Ceph的详细信息。 同时,您还需要重启Cinder服务以应用配置更改。您可以使用以下命令来重启Cinder服务: ``` [root@controller ~# systemctl restart openstack-cinder-api openstack-cinder-volume ``` 请确保您已经按照上述步骤正确地配置了Nova,并根据您的需求进行相应的配置。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [openstack ceph](https://blog.csdn.net/lingshengxiyou/article/details/129889267)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [OpenStack 使用Ceph 配置指导](https://blog.csdn.net/chinagissoft/article/details/50619153)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值