正确的 CMakeList 文件
Proper CMakeLists file
我正在尝试使用CLion和CMakeFiles使用LIBPQXX GithubforPostgreSQL构建一个项目。这是我针对此问题的简单代码,pqxx::connection con();
函数中的参数是故意为帖子更改的。
#include <iostream>
#include <pqxx/pqxx>
#include "project_config.h"
int main()
{
pqxx::connection conn("dbname = dbname user = user password = password hostaddr = hostaddr port = port");
std::cout << "Opened database successfully: " << std::endl;
return 0;
}
当我在命令行管理程序中执行命令时
g++ -std=c++11 -I /usr/local/include/pqxx/ -L /usr/local/lib/ -I /usr/pgsql-10/include/ -L /usr/pgsql-10/lib/ main.cpp -lpqxx -lpq -o run
在那之后./run
,一切都按预期进行。
现在,当我使用这些CMakeFiles设置来获得相同的结果以在CLion中运行项目
cmake_minimum_required(VERSION 3.10)
project(project)
# Set flags
set(COMPILE_FLAGS "-std=c++11")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMPILE_FLAGS}")
# The version number.
set (project_VERSION_MAJOR 1)
set (project_VERSION_MINOR 0)
# Use a header file for some CMake settings in the source code
configure_file (
"${PROJECT_SOURCE_DIR}/project_config.h.in"
"${PROJECT_BINARY_DIR}/project_config.h"
)
# Set new own names
set(APP_DOMAIN ${PROJECT_SOURCE_DIR}/dev/hmmenc_client)
set(PQXX /usr/local/include/pqxx)
set(PGSQL_10 /usr/pgsql-10/include)
# Find the pqxx and pq libraries
find_library(PQXX_LIB pqxx "${PQXX}")
find_library(PQ_LIB pq "${PGSQL_10}")
include_directories(${PROJECT_BINARY_DIR})
# Other project path includes
include_directories(${APP_DOMAIN})
include_directories(${PQXX})
include_directories(${PGSQL_10})
find_package(FindPQXX)
set(SOURCE_FILES
# ${APP_DOMAIN}/db/db.h
# ${APP_DOMAIN}/db/db.cpp
${APP_DOMAIN}/main.cpp
)
add_executable(project ${SOURCE_FILES})
target_link_libraries(${TARGET_NAME} pqxx)
#link_directories(project ${PQXX})
但是当我尝试运行它时,我得到:
CMakeFiles/project.dir/dev/hmmenc_client/main.cpp.o: In function `pqxx::connection_base::connection_base(pqxx::connectionpolicy&)':
/usr/local/include/pqxx/connection_base.hxx:695: undefined reference to `int pqxx::internal::check_library_version<6, 2>()'
/usr/local/include/pqxx/connection_base.hxx:698: undefined reference to `pqxx::connection_base::clearcaps()'
CMakeFiles/project.dir/dev/hmmenc_client/main.cpp.o: In function `pqxx::connect_direct::connect_direct(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
/usr/local/include/pqxx/connection.hxx:83: undefined reference to `pqxx::connectionpolicy::connectionpolicy(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
/usr/local/include/pqxx/connection.hxx:83: undefined reference to `vtable for pqxx::connect_direct'
CMakeFiles/project.dir/dev/hmmenc_client/main.cpp.o: In function `pqxx::connect_direct::~connect_direct()':
/usr/local/include/pqxx/connection.hxx:78: undefined reference to `vtable for pqxx::connect_direct'
/usr/local/include/pqxx/connection.hxx:78: undefined reference to `pqxx::connectionpolicy::~connectionpolicy()'
CMakeFiles/project.dir/dev/hmmenc_client/main.cpp.o: In function `pqxx::basic_connection<pqxx::connect_direct>::~basic_connection()':
/usr/local/include/pqxx/basic_connection.hxx:66: undefined reference to `pqxx::connection_base::close()'
CMakeFiles/project.dir/dev/hmmenc_client/main.cpp.o: In function `pqxx::basic_connection<pqxx::connect_direct>::basic_connection(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
/usr/local/include/pqxx/basic_connection.hxx:57: undefined reference to `pqxx::connection_base::init()'
collect2: error: ld returned 1 exit status
gmake[3]: *** [CMakeFiles/project.dir/build.make:95: project] Error 1
gmake[2]: *** [CMakeFiles/Makefile2:68: CMakeFiles/project.dir/all] Error 2
gmake[1]: *** [CMakeFiles/Makefile2:80: CMakeFiles/project.dir/rule] Error 2
gmake: *** [Makefile:118: project] Error 2
有人可以帮助我进行CMakeLists配置以获得与在命令行管理程序中执行上述命令相同的结果吗?
更新
我尝试按照下面评论中的建议使用该FindPQXX.cmake
,但仍然收到错误
CMake Warning at CMakeLists.txt:76 (find_package):
By not providing "FindFindPQXX.cmake" in CMAKE_MODULE_PATH this project has
asked CMake to find a package configuration file provided by "FindPQXX",
but CMake did not find one.
Could not find a package configuration file provided by "FindPQXX" with any
of the following names:
FindPQXXConfig.cmake
findpqxx-config.cmake
Add the installation prefix of "FindPQXX" to CMAKE_PREFIX_PATH or set
"FindPQXX_DIR" to a directory containing one of the above files. If
"FindPQXX" provides a separate development package or SDK, be sure it has
been installed.
为了让事情更清楚一点。假设我的项目树如下所示:
project # Root folder
project/cmake-build-debug # Some cmake code
project/dev
project/dev/hmmenc_client/ # I write my program with all the subfolders and their classes here
project/dev/SEAL_API/ # Some other code to use later
我的CMakeLists.txt
和FindPQXX.cmake
文件在我的project
根文件夹中。我要编译的main.cpp
是project/dev/hmmenc_client/
我添加了
find_package(FindPQXX)
target_link_libraries(${TARGET_NAME} pqxx)
到我的CMakeFiles.txt
.我在这里错过了什么,${TARGET_NAME}
代表什么?我必须编辑FindPQXX.cmake
文件以包含/usr/pgsql-10/include/
和/usr/pgsql-10/lib/
,因为这是我的postgres开发要求的地方。真正的PostgreSQL数据库在其他机器上。
我使用标准设置从上面提到的Github安装libpqxx,因此相关文件夹/usr/local/include/pqxx/
和/usr/local/lib/
我是Cmake世界的新手,所以不要带走任何信息:)
要将库"foo"与CMake一起使用,惯用的方法是查找/使用/编写一个.cmake
文件,该文件使用CMake语法和命令确定foo在操作系统上的安装位置,并为target_link_libraries
设置适当的变量。
我在 github 上发现了一个 libpqxx 的分支,它恰好包含FindPQXX.cmake
。为了使用它,请在您的主CMakeLists.txt
中包含以下内容:
find_package(PQXX)
target_link_libraries(${TARGET_NAME} pqxx)
这是我对CMakeLists.txt
的工作配置,该在与 FindPQXX.cmake 文件不起作用后执行g++ -std=c++11 -I /usr/local/include/pqxx/ -L /usr/local/lib/ -I /usr/pgsql-10/include/ -L /usr/pgsql-10/lib/ main.cpp -lpqxx -lpq
。
cmake_minimum_required(VERSION 3.10)
project(project)
# Set flags
set(GCC_COVERAGE_COMPILE_FLAGS "-std=gnu++11")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}")
# The version number.
set(project_VERSION_MAJOR 1)
set(project_VERSION_MINOR 0)
# Use a header file for some CMake settings in the source code
configure_file (
"${PROJECT_SOURCE_DIR}/project_config.h.in"
"${PROJECT_BINARY_DIR}/project_config.h"
)
# Set some path variables
set(APP_DOMAIN ${PROJECT_SOURCE_DIR}/dev/hmmenc_client)
set(PQXX /usr/local/include/pqxx)
set(PGSQL_10 /usr/pgsql-10/include)
# Find the needed libraries for liniking with -lpqxx and -lpq flags
find_library(PQXX_LIB pqxx)
#message("PQXX_LIB is ${PQXX_LIB}")
find_library(PQ_LIB pq)
#message("PQ_LIB is ${PQ_LIB}")
# Project path includes
include_directories(${PROJECT_BINARY_DIR}
${APP_DOMAIN}
${PQXX}
${PGSQL_10}
)
#message("PQXX is ${PQXX}")
#message("PGSQL_10 is ${PGSQL_10}")
# Set source files
set(SOURCE_FILES
${APP_DOMAIN}/db/db.h
${APP_DOMAIN}/db/db.cpp
${APP_DOMAIN}/main.cpp
)
add_executable(project ${SOURCE_FILES})
# Link the liraries of pqxx and pq to the executable
target_link_libraries(project ${PQXX_LIB} ${PQ_LIB})
我不明白的一件事是,我的find_library(PQ_LIB pq)
在/user/lib64
中找到了pq
,我无法将其更改为在/usr/pgsql-10/lib
中查找,其中也有我更喜欢使用的文件。
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何确定我已使用非编码文件到达 EOF?
- 命名空间中具有.h和.cpp文件的类
- 更正 CMakeList.txt 用于谷歌测试的文件?
- 在Cmake构建CmakeList.txt中读取/解析XML文件
- 如何使用cmake从主要的CMakeList.txt复制目标文件?
- 将 OpenSSL 包含在 CMakeList.txt 文件中
- 正确的 CMakeList 文件
- Emscripten - 在 CMakeList 文件中传递 emscripten 选项
- 如何在 CMakeList 中包含 h/hpp 头文件.txt而不是 cpp 或其他 hpp 文件
- 在同一 CMakeList 文件中导入两个不同的项目
- 如何在CmakeList中添加目标链接库.so和.a文件
- 如何在 kdevelop中修改项目的CMakeList文件
- 将"CmakeList.txt"移动到 Clion 中的另一个文件夹