C++ 为什么链接器错误';多重定义';只有一个图书馆?在Android Studio中使用CMake(3.4.1)

C++ 为什么链接器错误';多重定义';只有一个图书馆?在Android Studio中使用CMake(3.4.1),c++,cmake,C++,Cmake,如上所述,我尝试编译一个本机库,以便在JNI中使用它。但我得到了以下错误: /src/main/cpp/app1.cpp.o:“…”的多个定义 /src/main/cpp/mylib.cpp.o:这里前面的定义 这仅在我使用.hh数据时出现,其中“包含完整的模板代码”。多重定义的内容在预编译库中,通过“HEADER\u FILES”包含头 这是我的CMakeLists.txt: set(HEARDER_SRC_DIRECTORY ${CMAKE_SOURCE_DIR}/../../header/

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

/src/main/cpp/app1.cpp.o:“…”的多个定义

/src/main/cpp/mylib.cpp.o:这里前面的定义

这仅在我使用.hh数据时出现,其中“包含完整的模板代码”。多重定义的内容在预编译库中,通过“HEADER\u 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"
#include "jni.h"
#include "header1.h"
#include "header1.hh"
#include <vector>
#include <cmath>
#include <iostream>
#include <fstream>
#include <string>

序列化程序::resetCounter()
的定义未内联。这意味着包含
“header1.h”
(直接或间接)的每个翻译单元(源文件)都有自己的函数定义。这可能导致编译器抱怨违反了一个定义规则

如果您打算在头文件中使该函数成为内联函数,可以通过将定义移动到类
序列化程序
本身,或使用
内联
关键字来实现

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

查找“一个定义规则”。谢谢,这是非常基本的,我明白了,但我没有明白,在我的代码中可能是这样的。如果我在Android Studio之外使用这个库,它会工作。只要我把它和CMake中的header1.hh链接起来,它就不会了。mylib.cpp只调用此库的一个函数,没有更多内容。另外,read
这仅在我使用.hh数据时出现,其中“包含完整模板代码”
-显示该文件(以格式)。否则,揭示您的问题只是一个猜测游戏。我想是的,因为在这些上下文中,对于.hh,标题中已经有了一些定义(请参见问题)。这将使用mylib和app1编译,因此它是多个。如果其他人不知道“内联”是什么意思,有没有办法在不触及库的情况下改变它
inline void Serializer::resetCounter()
{ 
  _iBlock = 0;
}