AIX xlC кросс-компиляция / связывание для C++, не находящего символы C
Я пытаюсь выполнить кросс-компиляцию в AIX с помощью компиляторов xlc/xlC.
Код успешно компилируется, когда он использует настройки по умолчанию на другом компьютере. Код фактически успешно компилируется с помощью кросс-компиляции, но проблема связана с компоновщиком. Это команда, которая связывает объекты вместе:
$(CHILD_OS)/usr/vacpp/bin/xlC -q32 -qnolib -brtl -o $(EXECUTABLE) $(OBJECT_FILES)
-L$(CHILD_OS)/usr/lib
-L$(CHILD_OS)/usr/vacpp/lib/profiled
-L$(CHILD_OS)/usr/vacpp/lib
-L$(CHILD_OS)/usr/vac/lib
-L$(CHILD_OS)/usr/lib
-lc -lC -lnsl -lpthread
-F$(CHILD_OS)$(CUSTOM_CONFIG_FILE_LOCATION)
Когда я пытаюсь связать код, я получаю несколько неопределенных символов: .setsockopt(int,int,int,const void*,unsigned long), .socket(int,int,int), .connect(int,const sockaddr*, без подписи)
Я обнаружил, что отсутствующие символы взяты из стандартной библиотеки c, libc.a. Когда я посмотрел на символы с nm для файла libc.a, который подбирается, символы действительно существуют. Я предполагаю, что может быть проблема с тем, что C++ не может читать объекты C, но я действительно стреляю в темноте.
2 ответа
Звучит так, будто это может быть проблема искажения имени в C++.
Бежать nm
в объектных файлах, чтобы узнать символы, которые они ищут. Затем сравните точные имена с библиотеками.
Затем проверьте команды компиляции, чтобы убедиться, что включена правильная версия заголовочных файлов - может быть, она включает в себя копию родительской ОС по ошибке?
В конце концов я смог обойти это. Похоже, я использовал компилятор C++ для.c файлов. Использование компилятора xlc вместо компилятора xlC для файлов C решило эту проблему.