提问者:小点点

CMake初学者的问题:带有第三方库的项目未编译


所以我现在和cmake斗争了一段时间。我想从这里使用xmlrpc-c库。所以我用main.cpp和cmakelists.txt启动了一个新项目,并将xmlrpc-c作为子目录复制到我的项目中(因为不幸的是xmlrpc-c不是cmake库):

我的代码正是这里的一个示例,看起来如下所示:

#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(&registry).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”,新的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

少了什么?


共2个答案

匿名用户

既然您是CMake的新手,也许值得看一下教程?

https://cliutils.gitlab.io/modern-cmake/

我想这对你的困惑会有很大帮助。

匿名用户

由于您要使用的库没有cmake项目,所以您需要自己处理这个问题。我建议使用add_subdirectory并创建一个子项目,在该项目中构建库(根据需要,可以是共享的,也可以是静态的)。

此外,您需要将cmake指向头的位置。尝试手动将缺少的内容添加到add_executable或使用include_directories并相应地调整#include

您也可以使用它的一些非官方的cmake版本,比如这个版本。如果您正在使用git,那么您可以将repo添加为一个子模块,并将来自该repo的代码集成到您的主项目中。