CMake 新手问题:带有第 3 方库的项目未编译
CMake Beginner's Question: project with 3rd party library gets not compiled
所以我现在在 cmake 上苦苦挣扎了一段时间。我想使用 here 中的 xmlrpc-c 库。所以我用 main.cpp 和 CMakeLists.txt 开始了一个新项目,并将 xmlrpc-c 作为子目录复制到我的项目中(因为不幸的是 xmlrpc-c 不是 cmake 库):
我的代码完全是 here 中的示例,看起来像这样:
#include <iostream>
#include <string>
#include "xmlrpc-c/include/xmlrpc-c/base.hpp"
#include "xmlrpc-c/include/xmlrpc-c/registry.hpp"
#include "xmlrpc-c/include/xmlrpc-c/server_abyss.hpp"
using namespace std;
class hello : public xmlrpc_c::method
{
public:
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
string msg(params.getString(0));
params.verifyEnd(1);
cout << msg << endl;
*retval = xmlrpc_c::value_string("XMLRPC server says hello!");
}
};
int main(int argc, char** argv)
{
xmlrpc_c::registry registry;
registry.addMethod("hello", new hello);
xmlrpc_c::serverAbyss server(xmlrpc_c::serverAbyss::constrOpt().registryP(®istry).portNumber(8080));
server.run();
return 1;
}
CMakeLists.txt 看起来像这样
cmake_minimum_required(VERSION 3.16)
project(xmlrpc_c_server C CXX)
add_executable(xmlrpc_c_server main.cpp)
target_link_libraries(xmlrpc_c_server -lxmlrpc++ -lxmlrpc_server++ -lxmlrpc_server_abyss++ -lxmlrpc_util++)
我遇到的问题是我的构建过程因链接器错误而失败:据我所知,头文件 registry.hpp
未正确包含。如果我注释掉代码行registry.addMethod("hello", new hello);
,我可以编译程序没有任何错误。
====================[ Build | xmlrpc_c_server | Debug ]=========================
/usr/bin/cmake --build /mnt/c/Users/valentin.ackva/CLionProjects/xmlrp-c-server/cmake-build-debug --target xmlrpc_c_server -- -j 9
Scanning dependencies of target xmlrpc_c_server
[ 50%] Building CXX object CMakeFiles/xmlrpc_c_server.dir/main.cpp.o
[100%] Linking CXX executable xmlrpc_c_server
/usr/bin/ld: CMakeFiles/xmlrpc_c_server.dir/main.cpp.o: in function `main':
/mnt/c/Users/struppel/CLionProjects/xmlrp-c-server/main.cpp:31: undefined reference to `xmlrpc_c::registry::addMethod(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, xmlrpc_c::method*)'
collect2: error: ld returned 1 exit status
make[3]: *** [CMakeFiles/xmlrpc_c_server.dir/build.make:84: xmlrpc_c_server] Error 1
make[2]: *** [CMakeFiles/Makefile2:76: CMakeFiles/xmlrpc_c_server.dir/all] Error 2
make[1]: *** [CMakeFiles/Makefile2:83: CMakeFiles/xmlrpc_c_server.dir/rule] Error 2
make: *** [Makefile:118: xmlrpc_c_server] Error 2
少了什么?
由于您要使用的库没有 cmake
项目,您需要自行处理。我建议使用 add_subdirectory
并创建一个 sub-project,您可以在其中构建库(根据您的需要作为共享库或静态库)。
此外,您需要将 cmake
指向 headers 的位置。尝试手动将缺少的内容添加到 add_executable
或使用 include_directories
并相应地调整您的 #include
s。
您也可以使用它的一些非官方 cmake
版本,例如 this one。如果您使用 git
,您可以将存储库添加为子模块,并将该存储库中的代码集成到您的主项目中。
既然您是 CMake 的新手,也许值得看看教程?
https://cliutils.gitlab.io/modern-cmake/
我认为这会对您的困惑有很大帮助。
所以我现在在 cmake 上苦苦挣扎了一段时间。我想使用 here 中的 xmlrpc-c 库。所以我用 main.cpp 和 CMakeLists.txt 开始了一个新项目,并将 xmlrpc-c 作为子目录复制到我的项目中(因为不幸的是 xmlrpc-c 不是 cmake 库):
我的代码完全是 here 中的示例,看起来像这样:
#include <iostream>
#include <string>
#include "xmlrpc-c/include/xmlrpc-c/base.hpp"
#include "xmlrpc-c/include/xmlrpc-c/registry.hpp"
#include "xmlrpc-c/include/xmlrpc-c/server_abyss.hpp"
using namespace std;
class hello : public xmlrpc_c::method
{
public:
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
string msg(params.getString(0));
params.verifyEnd(1);
cout << msg << endl;
*retval = xmlrpc_c::value_string("XMLRPC server says hello!");
}
};
int main(int argc, char** argv)
{
xmlrpc_c::registry registry;
registry.addMethod("hello", new hello);
xmlrpc_c::serverAbyss server(xmlrpc_c::serverAbyss::constrOpt().registryP(®istry).portNumber(8080));
server.run();
return 1;
}
CMakeLists.txt 看起来像这样
cmake_minimum_required(VERSION 3.16)
project(xmlrpc_c_server C CXX)
add_executable(xmlrpc_c_server main.cpp)
target_link_libraries(xmlrpc_c_server -lxmlrpc++ -lxmlrpc_server++ -lxmlrpc_server_abyss++ -lxmlrpc_util++)
我遇到的问题是我的构建过程因链接器错误而失败:据我所知,头文件 registry.hpp
未正确包含。如果我注释掉代码行registry.addMethod("hello", new hello);
,我可以编译程序没有任何错误。
====================[ Build | xmlrpc_c_server | Debug ]=========================
/usr/bin/cmake --build /mnt/c/Users/valentin.ackva/CLionProjects/xmlrp-c-server/cmake-build-debug --target xmlrpc_c_server -- -j 9
Scanning dependencies of target xmlrpc_c_server
[ 50%] Building CXX object CMakeFiles/xmlrpc_c_server.dir/main.cpp.o
[100%] Linking CXX executable xmlrpc_c_server
/usr/bin/ld: CMakeFiles/xmlrpc_c_server.dir/main.cpp.o: in function `main':
/mnt/c/Users/struppel/CLionProjects/xmlrp-c-server/main.cpp:31: undefined reference to `xmlrpc_c::registry::addMethod(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, xmlrpc_c::method*)'
collect2: error: ld returned 1 exit status
make[3]: *** [CMakeFiles/xmlrpc_c_server.dir/build.make:84: xmlrpc_c_server] Error 1
make[2]: *** [CMakeFiles/Makefile2:76: CMakeFiles/xmlrpc_c_server.dir/all] Error 2
make[1]: *** [CMakeFiles/Makefile2:83: CMakeFiles/xmlrpc_c_server.dir/rule] Error 2
make: *** [Makefile:118: xmlrpc_c_server] Error 2
少了什么?
由于您要使用的库没有 cmake
项目,您需要自行处理。我建议使用 add_subdirectory
并创建一个 sub-project,您可以在其中构建库(根据您的需要作为共享库或静态库)。
此外,您需要将 cmake
指向 headers 的位置。尝试手动将缺少的内容添加到 add_executable
或使用 include_directories
并相应地调整您的 #include
s。
您也可以使用它的一些非官方 cmake
版本,例如 this one。如果您使用 git
,您可以将存储库添加为子模块,并将该存储库中的代码集成到您的主项目中。
既然您是 CMake 的新手,也许值得看看教程?
https://cliutils.gitlab.io/modern-cmake/
我认为这会对您的困惑有很大帮助。