[英]Qt Creator cannot find library with custom cmake step
在Qt Creator(版本3.0.1,Qt版本5.2.1)中,我使用以下CMakeLists.txt
文件进行了自定义cmake
步骤(而不是qmake
):
cmake_minimum_required (VERSION 2.8)
add_executable (myapp source.cpp)
target_link_libraries(myapp dl)
在我的source.cpp
文件中,我有以下代码:
#include <dlfcn.h>
int main()
{
dlopen("mylibrary.so", RTLD_NOW|RTLD_GLOBAL);
return 0;
}
而mylibrary.so
位于/usr/lib
。
当我使用cmake
并从命令行make
编译时,它会按预期进行编译。 但是,如果尝试在Qt Creator中进行构建,则会收到以下错误:
undefined reference to `dlopen'
这表明Qt Creator不知道在哪里找到libdl.so
,它位于/usr/lib/x86_64-linux-gnu
。
所以我的问题是:为什么从命令行运行cmake
和make
却无法在Qt Creator中进行构建? 以及如何告诉Qt Creator在哪里搜索libdl.so
?
首先,您应该在Qt软件中使用QLibrary
来处理动态加载,查找等操作。 您还可以避免现在遇到的麻烦。
其次,您可以使用它,但是要承认,这有点麻烦:
target_link_libraries(myapp /usr/lib/x86_64-linux-gnu/libdl.so)
第三,更好的方法是为此使用一些查找模块:
# - Find libdl
# Find the native LIBDL includes and library
#
# LIBDL_INCLUDE_DIR - where to find dlfcn.h, etc.
# LIBDL_LIBRARIES - List of libraries when using libdl.
# LIBDL_FOUND - True if libdl found.
IF (LIBDL_INCLUDE_DIR)
# Already in cache, be silent
SET(LIBDL_FIND_QUIETLY TRUE)
ENDIF (LIBDL_INCLUDE_DIR)
FIND_PATH(LIBDL_INCLUDE_DIR dlfcn.h)
SET(LIBDL_NAMES dl libdl ltdl libltdl)
FIND_LIBRARY(LIBDL_LIBRARY NAMES ${LIBDL_NAMES} )
# handle the QUIETLY and REQUIRED arguments and set LIBDL_FOUND to TRUE if
# all listed variables are TRUE
INCLUDE(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(LibDL DEFAULT_MSG LIBDL_LIBRARY LIBDL_INCLUDE_DIR)
IF(LIBDL_FOUND)
SET( LIBDL_LIBRARIES ${LIBDL_LIBRARY} )
ELSE(LIBDL_FOUND)
SET( LIBDL_LIBRARIES )
ENDIF(LIBDL_FOUND)
MARK_AS_ADVANCED( LIBDL_LIBRARY LIBDL_INCLUDE_DIR )
然后,只要在cmake模块路径中有它,就可以找到它如下:
find_package(LIBDL REQUIRED)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.