Как связать статическую библиотеку с cmake в 64-битной Linux? - PullRequest
0 голосов
/ 07 сентября 2011

Я строю свой проект с помощью cmake в Linux.

Я связываю некоторые статические библиотеки с помощью

set(BUILD_SHARED_LIBS FALSE)
set(CMAKE_EXE_LINKER_FLAGS "-static")

target_link_libraries(MyProject /usr/lib/libImlib2.a)

Он отлично работает в 32-битной Linux (в моем случае, Ubuntu), а не в 64-битной Ubuntu

Появляется это сообщение об ошибке.

/usr/bin/ld: /usr/lib64/libImlib2.a(api.o) : relocation R_X86_64_32 againts '.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC
/usr/lib64/libImlib2.a : could not read symbols: Bad value
collect2:ld returned 1 exit status

В каком-то документе, который я нашел, говорится, что это проблема 64-битного Linux, необходимо установить флаги.

Итак, я добавляю

set(CMAKE_CXX_FLAGS_DEBUG "-fPIC")
set(CMAKE_CXX_FLAGS_RELEASE "-fPIC")

но ничего не изменилось.

Не могли бы вы дать мне несколько советов о том, что мне следует делать?

Большое спасибо за чтение этого вопроса.

Ответы [ 2 ]

2 голосов
/ 07 сентября 2011

Вам нужно собрать Imlib2 (на самом деле ~ все разделяемые библиотеки), включив -fPIC Взгляните на эту статью , чтобы объяснить, почему это происходит.

1 голос
/ 27 февраля 2014

Исправление, которое необходимо перекомпилировать с -fPIC для архитектуры x86_64. Более подробная информация об этом доступна по адресу:

http://www.technovelty.org/c/position-independent-code-and-x86-64-libraries.html https://en.wikipedia.org/wiki/Position-independent_code

Добавьте следующие строки в ваш основной CMakeLists.txt

IF(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64") ADD_DEFINITIONS(-fPIC) ENDIF()

...