Cmake: linking shared library

我的梦境 提交于 2019-12-03 13:41:07

问题


I've done this before a couple of times, but somehow I'm stuck this time. I have an executable "myapp" and a own shared library "mylib". In my cmakelists I have the following:

ADD_LIBRARY(mylib SHARED ${SOURCES_LIB})
INSTALL(TARGETS mylib DESTINATION .)
ADD_EXECUTABLE(myapp ${SOURCES_APP})
TARGET_LINK_LIBRARIES(myapp ${QT_LIBRARIES} mylib)
INSTALL(TARGETS myapp DESTINATION .)

Everything compiles and links correctly, but when I start myapp, I get the following error:

error while loading shared libraries: libmylib.so: cannot open shared object file: No such file or directory

The lib and the executable are present in the install directory. When I make my library static by changing the first line of the above cmakelists to:

ADD_LIBRARY(mylib STATIC ${SOURCES_LIB})

then everything works 100%.

Does anyone know what I'm doing wrong?


回答1:


During the installation of your library and executable, the runtime paths to find the library are stripped from the executable. Therefore your library has to reside in the runtime library search path. For example under Linux, try to set LD_LIBRARY_PATH to the directory that contains the installed library when starting your executable.




回答2:


This is a very common question about "make install". Actually, there are 3 ways to link a library to your executable file. Frist, you may use -l -L flags in simple cases. As Benjamin said you may use LD_LIRARY_PATH and write something like: export LD_LIBRARY_PATH=/usr/local/my_lib. In fact this is not a good way. It's much better to use RPATH. There is a very usefull doc page about it. Check it out. Well if you write something like this in your top level CMakeLists.txt, it will solve the problem:

SET(CMAKE_SKIP_BUILD_RPATH  FALSE)
SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) 
SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib64")
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib64")


来源:https://stackoverflow.com/questions/8880802/cmake-linking-shared-library

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!