У меня действительно сложная проблема в GCC.
Я получаю следующую ошибку:
gcc -Wall -Werror -L/Users/red_angel/chorebox_sys/lib -o products/chbc2c -lchorebox ofiles/main.o
Undefined symbols for architecture x86_64:
"_chbclib_flushout", referenced from:
_main in main.o
"_chorebox_argc", referenced from:
_chorebox_command_line in libchorebox.a(chorebox_command_line.o)
"_chorebox_argv", referenced from:
_chorebox_command_line in libchorebox.a(chorebox_command_line.o)
"_chorebox_env", referenced from:
_chorebox_command_line in libchorebox.a(chorebox_command_line.o)
"_mn_command_options", referenced from:
_main in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [products/chbc2c] Error 1
Что не так с этой ошибкой? Я подтвердил, что символ _chorebox_argc
действительно присутствует в "libchorebox.a".
Я подтвердил это, выполнив команду:
nm /Users/red_angel/chorebox_sys/lib/libchorebox.a | cat -n | chodo -_chorebox_argc flip
Поскольку команда «chodo» — это команда, которую я написал, возможно, вы не знакомы, я объясню, что она делает. Он читает из стандартного ввода и пересылает в стандартный вывод каждую строку, соответствующую шаблону поиска. В этом случае (если коротко) он выводит каждую строку, содержащую строку «_chorebox_argc
».
Я получаю следующий вывод:
3 0000000000000004 C _chorebox_argc
55 U _chorebox_argc
Чтобы поближе взглянуть на соответствующую часть файла, я набираю ту же команду, только на этот раз опуская команду «chodo» в конце последовательности команд --- и тем самым копирую/вставляю вам соответствующие часть этого файла:
1
2 /Users/red_angel/chorebox_sys/lib/libchorebox.a(vars.o):
3 0000000000000004 C _chorebox_argc
4 0000000000000008 C _chorebox_argv
5 0000000000000008 C _chorebox_env
6
7 /Users/red_angel/chorebox_sys/lib/libchorebox.a(chorebox_mlc.o):
8 00000000000000c8 s EH_frame0
9 0000000000000075 s L_.str
10 U ___stderrp
11 U _chorebox_argv
12 0000000000000000 T _chorebox_mlc
13 00000000000000e0 S _chorebox_mlc.eh
14 U _exit
15 U _fflush
16 U _fprintf
17 U _malloc
18
19 /Users/red_angel/chorebox_sys/lib/libchorebox.a(chorebox_apend_string.o):
20 0000000000000078 s EH_frame0
21 0000000000000000 T _chorebox_apend_string
22 0000000000000090 S _chorebox_apend_string.eh
23 U _chorebox_join_string
24 U _free
25
Излишне говорить, что символ определенно присутствует в файле "libchorebox.a" ----- так почему компоновщик GCC жалуется, что он не найден?
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
: можете ли вы заставить $LD указывать на GNU ld, чтобы у нас не было проблем с совместимостью с clang? - person Marcus Müller   schedule 12.02.2015-m32
и-m64
в разных частях процесса компиляции. Вы на Mac? - person Jonathan Leffler   schedule 12.02.2015