为什么只有一个库的链接器错误'multiple definitions'?在 Android Studio 中使用 CMake (3.4.1)



如上所述,我试图编译一个本地库,以便在JNI中使用它。但我得到以下错误:

/src/main/cpp/app1.cpp.o:"…"的多重定义

/src/main/cpp/mylib.cpp.o:此处的先前定义

只有当我使用.hh数据时才会出现;包括完整的模板代码";。多重定义的内容在预编译库中,头文件通过"HEADER_FILES"包含。

这是我的CMakeLists.txt:

set(HEARDER_SRC_DIRECTORY ${CMAKE_SOURCE_DIR}/../../header/src)
include_directories(${HEADER_SRC_DIRECTORY})
set(HEADER_FILES ${HEADER_SRC_DIRECTORY}/header1.h ${HEADER_SRC_DIRECTORY}/header2.h ${HEADER_SRC_DIRECTORY}/header1.hh ${HEADER_SRC_DIRECTORY}/header2.hh)
add_library(
mylib
SHARED
src/main/mylib.cpp
${HEADER_FILES}
src/main/app1.h
src/main/app1.cpp
)
find_library(
log-lib
log 
)
target_link_libraries(  
mylib
${CMAKE_SOURCE_DIR}/libs/liby.a     # precompiled lib
${CMAKE_SOURCE_DIR}/libs/libz.a     # precompiled lib
${log-lib}
)

我该怎么解决?据我所知,每个.cpp在链接之前都会自行编译,然后它们就已经有了相同的定义。当然,他们有,这就是为什么我在mylib中链接app1,这样我就可以访问一些功能。我的逻辑错误在哪里?把它们分开会有帮助吗?

mylib.cpp包括什么:

#include <jni.h>
#include <string>
#include "app1.h"

app1.h包括什么:

#include "jni.h"
#include "header1.h"
#include "header1.hh"
#include <vector>
#include <cmath>
#include <iostream>
#include <fstream>
#include <string>

以下是双重定义的一部分(在header1.h中(:

namespace nsp {
Class::Class(Able& able, std::string name)
: _able(able), _iBlock(0), _size(0), _name(name)
{ }
void Serializer::resetCounter()
{ 
_iBlock = 0;
}
....
}

Serializer::resetCounter()的定义没有内联。这意味着包括"header1.h"(直接或间接(的每个翻译单元(源文件(都将有自己的函数定义。这可能导致编译器抱怨违反了一个定义规则。

如果您的意图是在头文件中使其成为内联函数,那么可以通过将定义移动到类Serializer本身中,或者使用inline关键字来实现。

inline void Serializer::resetCounter()
{ 
_iBlock = 0;
}

最新更新