首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么链接器在只有一个库的情况下出现“多个定义”错误?在Android Studio中使用CMake (3.4.1)

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

Stack Overflow用户
提问于 2018-07-31 06:07:41
回答 1查看 1.5K关注 0票数 3

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

/src/main/cpp/app1.cpp.o:'...‘的多个定义

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

这只在我使用.hh数据时才会出现,它“包含完整的模板代码”。多个定义的东西在一个预编译库中,通过'HEADER_FILES‘包含头文件。

这是我的CMakeLists.txt:

代码语言:javascript
复制
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包含的内容:

代码语言:javascript
复制
#include <jni.h>
#include <string>
#include "app1.h"

app1.h包括:

代码语言:javascript
复制
#include "jni.h"
#include "header1.h"
#include "header1.hh"
#include <vector>
#include <cmath>
#include <iostream>
#include <fstream>
#include <string>

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

代码语言:javascript
复制
namespace nsp {

Class::Class(Able& able, std::string name)
  : _able(able), _iBlock(0), _size(0), _name(name)
{ }

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

....

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-31 07:22:21

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

如果您打算使该函数成为头文件中的内联函数,则可以通过将定义移到类Serializer本身中或使用inline关键字来实现。

代码语言:javascript
复制
inline void Serializer::resetCounter()
{ 
  _iBlock = 0;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51602927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档