c++ - 如何在没有源文件的情况下使用静态库(在我的例子中是 assimp)

标签 c++ cmake static-libraries assimp

我有一个 libassimp.a 文件和头文件。我如何使用图书馆?

我正在使用 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -isystem ${ASSIMP_INCLUDE_DIR}") 将头文件添加到我的项目中。 ASSIMP_INCLUDE_DIR 为 ../contrib/assimp/include。

现在,当我在我的 main.cpp 中使用某些类时,它会给我一些关于对某些函数的 undefined reference 的错误,因为显然我没有源文件。

当我将 libassimp.a 添加到我的编译标志时,我在使用 make 时遇到以下错误:

make[3]: *** No rule to make target `../contrib/assimp/lib/libassimp.a',
...
main.cpp:7:32: fatal error: assimp/Importer.hpp: No such file or directory
....
Linking CXX static library libassimp.a

我不明白这些消息。也许他们在那里是因为它试图在它实际存在之前访问 libassimp.a?这是某种并发问题吗?

无论如何,如果我再次调用 make 然后我会得到不同的错误,即一堆未定义的对我没有使用的东西的引用,例如

../contrib/assimp/lib/libassimp.a(AssbinLoader.cpp.o): In function `Assimp::AssbinImporter::InternReadFile(std::string const&, aiScene*, Assimp::IOSystem*)':
AssbinLoader.cpp:(.text+0x2a49): undefined reference to `uncompress'

编辑:

我像这样用 CMake 编译:

target_link_libraries(monoRenderer [some other libraries] ${ASSIMP_STATIC_LIB})

ASSIMP_STATIC_LIB 是 libassimp.a 的路径。

编辑 2:

我将我的 CMake 文件缩减为:

cmake_minimum_required(VERSION 2.8.12)
project(monoRenderer)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")

file(GLOB_RECURSE CXX_SRCS src/*.cpp)
file(GLOB_RECURSE C_SRCS src/*.c)
file(GLOB_RECURSE HPP_HDRS src/*.hpp)
file(GLOB_RECURSE H_HDRS src/*.h)
set(SRCS "${C_SRCS};${CXX_SRCS}")
set(HDRS "${H_HDRS};${HPP_HDRS}")

include_directories(${PROJECT_SOURCE_DIR}/contrib/assimp/include)

add_executable(monoRenderer ${SRCS} ${HDRS})
target_link_libraries(monoRenderer ${PROJECT_SOURCE_DIR}/contrib/assimp/lib/libassimp.a)

头文件在 contrib/assimp/include 中,libassmip.a 在 contrib/assimp/lib 中。它仍然不起作用,与以前一样的错误。 我的 main.cpp 看起来像这样:

#include <assimp/Importer.hpp>
#include <cstdlib>

int main() {
    Assimp::Importer importer;
    return EXIT_SUCCESS;
}

编辑3:

我认为它与 zlib 有关,因为我认为所有的错误似乎都有一个共同点:

undefined reference to `uncompress'
undefined reference to `inflateInit2_'
undefined reference to `inflate'
undefined reference to `inflateEnd'
undefined reference to `inflateReset'
undefined reference to `inflateSetDictionary'
undefined reference to `get_crc_table'
undefined reference to `crc32'

最佳答案

正如您所说,您在使用 zlib 时遇到了问题。您必须自己添加静态库中的所有依赖项,例如:

target_link_libraries(monoRenderer z)

由于您声明您的 header 位于 contrib/assimp/include 中,您可能希望将 main.cpp 中的包含更改为

#include <Importer.hpp>

关于c++ - 如何在没有源文件的情况下使用静态库(在我的例子中是 assimp),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35206153/

相关文章:

c++ - glm 设置对象位置

c++ - 在同一张图上将脸部轮廓检测为2个轮廓

cmake - 如何使用 shell 命令的结果初始化 CMake 变量

objective-c - Objective - C 静态库和它的公共(public)头文件 - 什么是正确的方法?

ios - 编译器会从产品二进制文件中的依赖静态库中剥离不相关的拱形符号吗?

c++ - 交叉兼容/平台 C++

c++ - Ubuntu Linux 的编译问题

c++ - 使用CMake install 命令应该将可执行资源文件安装到哪里?

无法打开输出文件: Is a directory collect2: ld returned 1 exit status

c++ - 我在 Mingw 中为 fcntl.h 和 unistd.h 链接了哪些库