问题
When I try to build this project with cmake and gcc on a 64-bit linux (debian) machine, I get an error from the linker:
Linking C executable ../../../../cpsadamsx
/home/dala/lib64/libSimTKcommon.so: undefined reference to `dlopen'
/home/dala/lib64/libSimTKcommon.so: undefined reference to `dlclose'
/home/dala/lib64/libSimTKcommon.so: undefined reference to `dlerror'
/home/dala/lib64/libSimTKcommon.so: undefined reference to `dlsym'
collect2: ld returned 1 exit status
make[2]: *** [cpsadamsx] Error 1
make[1]: *** [sundials/examples/cpodes/serial/CMakeFiles/cpsadamsx.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
Apparently dlopen, dlclose, dlerror and dlsym are references to libdl.so. I have that library in /lib64/libdl.so.2, but why is it not found?
Would it have been a normal './configure; make; make install'-path I could have set the LIBS variable and issued the configure command like this (I think):
export LIBS=-ldl && ./configure
But how do I do it now?
UPDATE:
So it seems that the (or at least a) library is found, but does not contain the symbols in question. Perhaps it tries with the 32-bit library in /lib?
Is there a way to disassemble /lib64/libdl.so.2 to make sure it does have the references dlopen etc?
The problem now seems to guide the build tools to the correct version of the library.
回答1:
As this question is showing up on google and both answers won't point to the correct solution here it is:
In your CMakeLists.txt add ${CMAKE_DL_LIBS}
to link against idl.
It should look similar to this:
target_link_libraries(ExpandableTest
${CMAKE_DL_LIBS}
Expandable
ExpandableTestLibrary
)
回答2:
Probably you need to add target_link_libraries() - see link text
回答3:
Add this in CMakeLists.txt and it should work:
SET (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ldl")
来源:https://stackoverflow.com/questions/1274529/building-project-involving-cmake-how-do-i-make-it-aware-of-libraries