2

制御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

大丈夫です。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ファイルに変更するとコンパイルは成功します。何が問題ですか?

4

2 に答える 2

6

gcc -c main.cppコードをC++コードとしてコンパイルします。

その場合に起こりそうなことは、main.cppに、C++としてコンパイルされることを意図していない他のヘッダーファイルが含まれていることです。これは、これらのヘッダーファイルをC ++プログラムにインクルードする場合、gccはヘッダーファイルが宣言するすべてのものがC++であると想定することを意味します。

そうでない場合、コンパイラがC ++であると想定したCコードにリンクしようとすると、リンカエラーが発生します。

これらのヘッダーファイルがCであると述べることで、これを修正できます。たとえば、main.cppで実行します。

extern "C" {
#include "some_c_lib.h"
}
于 2012-11-20T20:45:58.113 に答える
0

おそらく使用していませんextern "C"

cppファイルの名前をcファイルに変更するとコンパイルは成功します。何が問題ですか?

于 2012-11-20T20:45:31.067 に答える