问题描述
我正在尝试使用位于 /usr/include/ 中的外部库在 Linux 上使用 CMake 在 KDevelop 中构建一个项目,并收到“未定义的函数引用”错误。
main()
#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.h
和 vlc.hpp
标头。
将 vlc.h
和 vlc.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 (将#修改为@)