在CLion下,用cmake使用动态库,始终出现ld undefined 错误, cmake如下:
cmake_minimum_required(VERSION 3.5) project(cpp5)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread -ldl -lmjx_util")
include_directories(../library/mjx/headers ../library) link_directories(../library/)
add_executable(cpp5 main.cpp)
后来网上查了资料,这块没什么特殊的,于是我就用网上的命令试了一下,下面的命令可以链接成功
g++ -I/mnt/d/pws/test/project/cpp/use_shared/../sharelib_example -L/mnt/d/pws/test/project/cpp/use_shared/../sharelib_example/ -std=c++11 -o ttt33 main.cpp -lsharelib_example
但是这个命令跟我cmake 配置的是一样的啊,于是我用 "-DCMAKE_VERBOSE_MAKEFILE=ON" 查看了一下cmake链接过程中的命令,发现是这样的
/usr/bin/c++ -I/mnt/d/pws/test/project/cpp/use_shared/../sharelib_example -L/mnt/d/pws/test/project/cpp/use_shared/../sharelib_example/ -lsharelib_example -g -std=gnu++11 -o CMakeFiles/use_shared.dir/main.cpp.o -c /mnt/d/pws/test/project/cpp/use_shared/main.cpp
上面cmake自动生成的这个命令,对比我从网上找到的命令,差别在于把 -lsharelib_example放到了最后,我把它移到最后,链接了一下果然成功了。
分析了一下原因,我自己指定了CXX_FLAGS,这样可能不太好,尽量还是用cmake提供的封装比较好,既然使用了cmake,就要遵从它的规则,于是我查了下资料,把cmake_files改成下面这样就可以了。
cmake_minimum_required(VERSION 3.5) project(use_shared)
set(CMAKE_CXX_STANDARD 11) include_directories(${PROJECT_SOURCE_DIR}/../sharelib_example/) link_directories(${PROJECT_SOURCE_DIR}/../sharelib_example/)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ")
add_executable(use_shared main.cpp) target_link_libraries(use_shared sharelib_example)
同时感叹于cmake的脆弱,颠倒了一下参数的顺序,居然出现这么奇怪的问题,还好可以从网上可以找到可以运行的命令做对比