CMake:在构建期间未定义对函数的引用

问题描述

我正在尝试使用位于 /usr/include/ 中的外部库在 Linux 上使用 CMake 在 KDevelop 中构建一个项目,并收到“未定义的函数引用”错误

ma​​in()

#include <iostream>
#include <vlcpp/vlc.hpp>
// #include <vlc/vlc.h> does nothing

int main() 
{    
    libvlc_instance_t* instance_c = libvlc_new(0,NULL); // using vlc 
    
    VLC::Instance* instance = new VLC::Instance(0,NULL); // using vlcpp
}

更多上下文

vlc.hpp一个文件,包含与用 C++ 编写的 vlcpp 库相关的文件。反过来,vlcpp 重用了 vlc 库中的代码,这些代码是在其类中用 C 编写的。 vlc.h 是包含与 vlc 库相关的文件的头文件。例如,Instance 类(请参阅代码部分的第二行)包含 vlc.h 并在其构造函数中使用函数 libvlc_new()

//vlc.hpp
#include "Instance.hpp"

//Instance.hpp
#include "common.hpp"

class Instance
{ 
    // aforementioned constructor
    Instance(int argc,const char *const * argv)
        : Internal{ libvlc_new( argc,argv ),libvlc_release }
    #if LIBVLC_VERSION_INT >= LIBVLC_VERSION(3,0),m_callbacks_pointers { std::make_shared<libvlc_dialog_cbs>() }
    #endif
    {
    }
}

//common.hpp
#include "vlc/vlc.h"

错误

这是我尝试构建项目时 KDevelop 所说的

/home/trofchik/Documents/cpp/coursework_poc_native/coursework_poc_native/build> /usr/bin/ninja-build
[1/2] Building CXX object CMakeFiles/coursework_poc_native.dir/main.cpp.o
[2/2] Linking CXX executable coursework_poc_native
Failed: coursework_poc_native 
: && /usr/bin/c++ -g -rdynamic CMakeFiles/coursework_poc_native.dir/main.cpp.o -o coursework_poc_native   && :
/usr/bin/ld: CMakeFiles/coursework_poc_native.dir/main.cpp.o: in function `main':
/home/trofchik/Documents/cpp/coursework_poc_native/coursework_poc_native/build/../main.cpp:8: undefined reference to `libvlc_new'
collect2: error: ld returned 1 exit status
ninja: build stopped: subcommand Failed.
*** Failure: Exit code 1 ***

请注意,解析器知道 libvlc_new()Instance,并且不会在这两行中加下划线。

我尝试了什么

使用 CMake 的官方文档和我在 Internet 上阅读的建议修改 CMake 文件。结果如下。

cmake_minimum_required(VERSION 3.0)

add_compile_options(-I -M)

project(coursework_poc_native)

add_library(vlcpp OBJECT /usr/include/vlcpp/vlc.
set_target_properties(vlcpp PROPERTIES LINKER_LANGUAGE CXX)
target_compile_deFinitions(vlcpp PUBLIC OBJ)

target_sources(vlcpp PUBLIC /usr/include/vlcpp/)

add_executable(coursework_poc_native main.cpp)
add_dependencies(coursework_poc_native vlcpp)

在 KDevelop 调用时创建构建文件成功,但构建错误仍然存​​在。

手动包含 vlc.hvlc.hpp 标头。

vlc.hvlc.hpp 的副本移动到项目目录中。

在包含语句中将 <> 替换为 ""

编辑

编辑的 CMakeLists:

cmake_minimum_required(VERSION 3.0)
#add_compile_options(-I -M)
project(coursework_poc_native)

add_executable(coursework_poc_native main.cpp)

add_library( #this library links fine even without mentioning it in CMakeLists
    vlcpp
        /usr/include/vlcpp/vlc.hpp # this header includes all files related to library
        )
target_include_directories(vlcpp PRIVATE /usr/include/vlcpp)
set_target_properties(vlcpp PROPERTIES LINKER_LANGUAGE CXX)

add_library( #this one causes "undefined reference" errors when linker tries to find methods from it such as libvlc_new()
    vlc SHARED
        /usr/include/vlc/vlc.h #same as with vlcpp
        )
target_include_directories(vlc PRIVATE /usr/include/vlc)        
set_target_properties(vlc PROPERTIES LINKER_LANGUAGE C)

target_link_libraries(vlcpp PRIVATE vlc) # should i link vlc into vlcpp if vlcpp depends on methods from vlc?
target_link_libraries(coursework_poc_native PRIVATE vlcpp)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...