Как gcc связывает статическую библиотеку?

У меня есть простая программа, использующая статическую библиотеку для управления устройством 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, то компиляция файлов будет успешной. В чем проблема?

2

Решение

gcc -c main.cpp скомпилирует ваш код как код C ++.

Вероятно, тогда произойдет, что ваш main.cpp включает в себя другие заголовочные файлы, которые не предназначен для компиляции как C ++. Это означает, что при включении этих заголовочных файлов в программу на C ++, gcc будет предполагать, что все файлы, которые объявлены в заголовочных файлах, являются C ++.

И если это не так, вы получите ошибки компоновщика, если попытаетесь ссылаться на код C, который, как предполагал компилятор, был C ++.

Вы можете исправить это, указав, что эти заголовочные файлы являются C. Например, в вашем main.cpp вы бы сделали

extern "C" {
#include "some_c_lib.h"}
6

Другие решения

Вы, вероятно, не использовали extern "C",

если я переименую файлы cpp в c, то компиляция файлов будет успешной. Что
проблема?

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector