为什么只有一个库会出现链接器错误“多个定义”?在Android Studio中使用CMake(3.4.1)

时间:2018-07-30 22:07:41

标签: c++ cmake

如上所述,我尝试编译一个本机库以在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;
}

....

}

1 个答案:

答案 0 :(得分:1)

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

如果您打算在头文件中创建一个内联函数,则可以通过将定义移至类Serializer本身或使用inline关键字来实现。

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