【问题标题】:Can't add locally compiled library to CMake project无法将本地编译的库添加到 CMake 项目
【发布时间】:2017-05-31 15:30:44
【问题描述】:

作为我正在进行的项目的一部分,我需要使用 WebKitGTK+ 库。 我下载了库(tarball)并按照here 的描述编译它。

编译完成后:
该库的标头位于/usr/local/include
lib 的.so 文件位于/usr/local/lib

在我的 C++ 项目中,我尝试添加以下 CMakeLists.txt 文件:

cmake_minimum_required(VERSION 3.7)
project(CVE_2016_4657)

set(CMAKE_CXX_STANDARD 11)
set(SOURCE_FILES main.cpp)
add_executable(CVE_2016_4657 ${SOURCE_FILES})

find_package(PkgConfig REQUIRED)

include_directories(/usr/local/include/webkitgtk-4.0)
link_directories(/usr/local/lib/webkit2gtk-4.0)

pkg_check_modules(GTK3 REQUIRED gtk+-3.0)
include_directories(${GTK3_INCLUDE_DIRS})
link_directories(${GTK3_LIBRARY_DIRS})
add_definitions(${GTK3_CFLAGS_OTHER})

pkg_check_modules(SOUP REQUIRED libsoup-2.4)
include_directories(${SOUP_INCLUDE_DIRS})
link_directories(${SOUP_LIBRARY_DIRS})
add_definitions(${SOUP_CFLAGS_OTHER})

target_link_libraries(
        CVE_2016_4657
        ${GTK3_LIBRARIES}
        ${SOUP_LIBRARIES})

但是,在编译项目时出现以下错误:

[ 50%] Linking CXX executable CVE_2016_4657
CMakeFiles/CVE_2016_4657.dir/main.cpp.o: In function `main':
/home/idanas/CLionProjects/Switcheroo/main.cpp:17: undefined reference to 
`webkit_web_view_get_type'
/home/idanas/CLionProjects/Switcheroo/main.cpp:17: undefined reference to 
`webkit_web_view_new'
/home/idanas/CLionProjects/Switcheroo/main.cpp:29: undefined reference to 
`webkit_web_view_load_uri'
collect2: error: ld returned 1 exit status
CMakeFiles/CVE_2016_4657.dir/build.make:94: recipe for target 
'CVE_2016_4657' failed
make[3]: *** [CVE_2016_4657] Error 1
CMakeFiles/Makefile2:67: recipe for target 
'CMakeFiles/CVE_2016_4657.dir/all' failed
make[2]: *** [CMakeFiles/CVE_2016_4657.dir/all] Error 2
CMakeFiles/Makefile2:79: recipe for target 
'CMakeFiles/CVE_2016_4657.dir/rule' failed
make[1]: *** [CMakeFiles/CVE_2016_4657.dir/rule] Error 2
Makefile:118: recipe for target 'CVE_2016_4657' failed
make: *** [CVE_2016_4657] Error 2

我几乎没有使用 CMake 的经验,我真的需要一些帮助。

【问题讨论】:

  • 不是该特定问题的重复项。
  • 我同意 WebKitGTK+ 有额外的(和首选)链接方式。但似乎问题应该改写,至少它的标题应该包含库的名称。另一方面,pkg_check_modules 的方法适用于很多库,可能应该在重复问题的答案中注明...

标签: c++ cmake webkit gtk webkitgtk


【解决方案1】:

您正在尝试使用 WebKitGTK+,它是一个独立于 GTK+ 和 libsoup 的库。您需要为 WebKitGTK+ 再次复制您的 pkg_check_modules() 代码。您需要首先确定您使用的是 WebKit1 还是 WebKit2(它们的 API 略有不同),然后为该版本的 WebKitGTK+ 找到适当的 pkg-config 名称;检查您的 /usr/lib/pkgconfig 目录的文档和内容。

【讨论】:

  • 我不使用pkg_check_modules() 的原因是该库是由我在本地编译的(因此位于/usr/local/... 下。我需要一个非常具体的(旧)版本的WebkitGTK+。汤和还需要 GTK(作为单独的库),因为 WebkitGTK+ 本身是无用的。
  • 请注意API是webkit2
  • 这个.lib 文件是静态链接的吗?如果您想这样做,您可能还需要自己提供 WebKit2GTK+ 二进制文件……您可以询问开发人员是否也可以进行静态链接。最新版本的 WebKit2GTK+ 有什么问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-05
  • 1970-01-01
  • 1970-01-01
  • 2017-02-16
  • 1970-01-01
  • 1970-01-01
  • 2018-03-30
相关资源
最近更新 更多