我有一个简单的程序使用静态库来控制pci设备。我有一些例子。但我想让自己做一些例子,但我无法链接静态库。
我有3个文件:led.cpp main.cpp main.h
gcc -c led.cpp -I../utils -I../driver -o led.o
gcc -c main.cpp -I../utils -I../driver -o main.o
没关系。 Succesfuly创建main.o和led.o目标文件。
但是当连接状态时,它就破碎了。 24dsi20c500k_utils.a和24dsi20c500k_dsl.a静态库。
gcc led.o main.o ../utils/24dsi20c500k_utils.a ../docsrc/24dsi20c500k_dsl.a -o led
显示输出:
led.o: In function `led_tests(int)':
led.cpp:(.text+0x18): undefined reference to `gsc_label(char const*)'
led.cpp:(.text+0x31): undefined reference to `dsi20c500k_initialize(int, int)'
led.cpp:(.text+0x39): undefined reference to `gsc_label_level_inc()'
led.cpp:(.text+0x5b): undefined reference to `dsi20c500k_led(int, int, int, int*)'
led.cpp:(.text+0x81): undefined reference to `dsi20c500k_led(int, int, int, int*)'
led.cpp:(.text+0xa2): undefined reference to `gsc_label_level_dec()'
led.cpp:(.text+0xb1): undefined reference to `dsi20c500k_initialize(int, int)'
main.o: In function `_perform_tests(int)':
main.cpp:(.text+0x3a1): undefined reference to `gsc_label(char const*)'
main.cpp:(.text+0x3c6): undefined reference to `gsc_id_driver(int, char const*)'
main.o: In function `main':
main.cpp:(.text+0x42c): undefined reference to `gsc_label_init(int)'
main.cpp:(.text+0x49a): undefined reference to `gsc_id_host()'
main.cpp:(.text+0x4a4): undefined reference to `gsc_count_boards(char const*)'
main.cpp:(.text+0x4b6): undefined reference to `gsc_select_1_board(int, int*)'
main.cpp:(.text+0x4d7): undefined reference to `gsc_label(char const*)'
main.cpp:(.text+0x500): undefined reference to `gsc_dev_open(unsigned int, char const*)'
main.cpp:(.text+0x54f): undefined reference to `gsc_dev_close(unsigned int, int)'
collect2: ld returned 1 exit status
make: *** [led] Error 1
如果我将cpp文件重命名为c文件编译成功。有什么问题?
答案 0 :(得分:6)
gcc -c main.cpp
将您的代码编译为C ++代码。
然后可能发生的是,你的main.cpp包含其他头文件, not 意味着编译为C ++。这意味着当在C ++程序中包含这些头文件时,gcc将假定头文件声明的所有内容都是C ++。
如果它们不是,如果您尝试链接到编译器假定为C ++的C代码,则会出现链接器错误。
您可以通过声明这些头文件是C.来解决此问题。在你的main.cpp中你要做
extern "C" {
#include "some_c_lib.h"
}
答案 1 :(得分:0)
您可能没有使用extern "C"
。
如果我将cpp文件重命名为c文件编译成功。是什么 问题