![](/img/trans.png)
[英]How do I compile + link C++ code in Xcode in an Objective-C project?
[英]How do I compile and link C++ code with compiled C code?
我希望能夠使用Cmockery來模擬從我正在測試的C ++代碼調用的C函數。 作為向前邁出的一步,我將Cmockery示例run_tests.c重命名為run_tests.cpp,並嘗試使用cmockery.c進行編譯和鏈接:
g++ -m32 -DHAVE_CONFIG_H -DPIC -I ../cmockery-0.1.2 -I /usr/include/malloc -c run_tests.cpp -o obj/run_tests.o
gcc -m32 -DHAVE_CONFIG_H -DPIC -Wno-format -I ../cmockery-0.1.2 -I /usr/include/malloc -c ../cmockery-0.1.2/cmockery.c -o obj/cmockery.o
g++ -m32 -o run_tests obj/run_tests.o obj/cmockery.o
前兩個命令行(編譯)是成功的,但在最后我得到:
Undefined symbols:
"_run_tests(UnitTest const*, unsigned long)", referenced from:
_main in run_tests.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
該未定義的符號來自run_tests.cpp的第29行:
return run_tests(tests);
run_tests()函數在cmockery.c中定義。
在閱讀“ 使用'gcc'(沒有g ++)鏈接C ++代碼 ”之后,我嘗試了:
gcc -lstdc++ -m32 -o run_tests obj/run_tests.o obj/cmockery.o
但得到了相同的結果:
Undefined symbols:
"_run_tests(UnitTest const*, unsigned long)", referenced from:
_main in run_tests.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
如何編譯和鏈接C ++代碼,以便在C代碼中找到符號?
我認為你可以通過在cmockery.h文件的內容周圍添加以下內容來使thinkgs從C ++鏈接:
在開頭或附近:
#if defined(__cplusplus)
extern "C" {
#endif
在結尾處或附近:
#if defined(__cplusplus)
}
#endif
這樣,在C源代碼中使用頭文件將忽略聲明的extern "C"
部分,但是當在C ++構建中包含頭部時,編譯器將被正確地告知該頭部中的聲明的鏈接使用C語義。
對於快速骯臟的測試,或者如果您不想修改標題,可以嘗試:
extern "C" {
#include "cmockery.h"
}
但我的偏好是將extern "C"
塊放在標題中(並且只在需要的東西周圍 - 這可能需要一些分析)。
在C ++代碼包含的頭文件中,需要對用C編譯的所有函數進行extern "C"
聲明。
當你從C ++中包含C頭文件時,你是否用extern "C" { .... }
包裝了原型? 如果不這樣做,C ++函數名稱將在鏈接時被“損壞”。
正如卡爾所說,需要extern "C" { .. }
。
原因:C ++破壞名稱(添加有趣的字符),以便鏈接是類型安全的。 C沒有,因此在語言中將foo(int)
鏈接到foo(double)
是可能的(但是錯誤和令人尷尬)。
為了成功實現互操作性,您需要告訴C ++編譯器一些函數名稱不會被破壞,以便鏈接成功。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.