簡體   English   中英

如何使用編譯的C代碼編譯和鏈接C ++代碼?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM