我目前正在研究我的第一个"严肃"的C项目,一个16位的虚拟机.当我将文件从一个大的源文件拆分成多个源文件时,链接器(无论是通过clang,gcc,cc还是ld调用)都会发出错误:
ld: duplicate symbol _registers in register.o and main.o for inferred
architecture x86_64
Run Code Online (Sandbox Code Playgroud)
registers
主文件中没有任何声明.uint16_t
如果有帮助,它是一个数组.我使用内置编译器(不是GNU gcc)在Mac OS 10.7.3上.有帮助吗?
这是我第一次处理一个比简单的write-single-source-file-and-compile例程稍微复杂一点的CUDA项目.正如所料,我面临着C标题的一些问题,即重复的符号.
根据链接器,在多个.cu
文件中包含以下头文件会产生冲突:
env_vars.h
#ifndef ENV_VARS_H_
#define ENV_VARS_H_
/*** GLOBAL VARIABLES ***/
unsigned int h_n_osc;
__device__ unsigned int d_n_osc;
/*** CONSTANTS ***/
const double OMEGA_0 = 6.447421494058077e+09;
/* other constants defined in the middle */
#endif
Run Code Online (Sandbox Code Playgroud)
multigpu.cu
#include "env_vars.h"
/* assigns h_n_osc */
Run Code Online (Sandbox Code Playgroud)
adm_matrix.cu
#include "env_vars.h"
/* uses h_n_osc */
Run Code Online (Sandbox Code Playgroud)
在Nsight Eclipse Edition中构建项目会导致链接器抱怨h_n_osc
变量被定义两次:
duplicate symbol _h_n_osc in:
./adm_matrix.o
./multigpu.o
ld: 1 duplicate symbol for architecture x86_64
Run Code Online (Sandbox Code Playgroud)
通过互联网搜索,我意识到将h_n_osc
变量的声明移动到multigpu.cu
并将其重新声明为extern
变量adm_matrix.cu
(以及我以后可能需要它的任何地方)解决了问题,事实上它确实存在. …
我正在使用CocoaPods添加两个框架.
target 'TestGoogleLib' do
# Comment the next line if you're not using Swift and don't want to use dynamic frameworks
use_frameworks!
# Pods for TestGoogleLib
pod 'GoogleMobileVision'
pod 'GoogleSignIn'
end
Run Code Online (Sandbox Code Playgroud)
但是当我跑 - 我得到重复的错误.似乎两个框架都使用相同的文件.
我的Pod版本是1.5.3
duplicate symbol _OBJC_IVAR_$_MDMPasscodeCache._localAuthenticationInfo in:
ld: 13 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)
如何使用CocoaPods安装两个没有冲突---我删除了所有冲突日志 - 如果需要,我可以添加它们.
为什么我的以下代码没有引发重复的符号冲突?
我提到了名称重整,但这似乎仅在参数存在差异时出现。但是,这里的参数没有差异。但是,它仍然不会引发冲突。为什么?
好
#include <stdio.h>
void printGood() {
printf("I am good");
}
Run Code Online (Sandbox Code Playgroud)
完美的
#include <stdio.h>
void printGood() {
printf("I am perfect");
}
Run Code Online (Sandbox Code Playgroud)
交流电
extern void printGood();
void bringGood() {
printGood();
}
Run Code Online (Sandbox Code Playgroud)
公元前
extern void printGood();
void bringPerfect() {
printGood();
}
Run Code Online (Sandbox Code Playgroud)
编排器
#include <stdio.h>
void bringGood();
void bringPerfect();
int main() {
printf("bringing good");
bringGood();
printf("bringing perfect");
bringPerfect();
return 1;
}
Run Code Online (Sandbox Code Playgroud)
编译行:
gcc -g -c good.c
gcc -g -c perfect.c
gcc -g -c A.c
gcc -g -c B.c
gcc -g -c orchestrator.c …
Run Code Online (Sandbox Code Playgroud) 我有一个iOS的框架,包含.c
,.mm
源文件.为方便起见,我们姑且称之为这两个文件A.c
和B.mm
.
在这两个文件中,我定义了一个具有相同功能协议的函数,如下所示.
// A.c
uint32_t get_file(const char *path)
{
...
}
// B.mm
uint32_t get_file(const char *path)
{
...
}
Run Code Online (Sandbox Code Playgroud)
据我所知,我认为这会在编译时抛出错误,因为有重复的符号,但它成功编译框架没有任何错误.我在这里错过了什么?
注意:duplicate symbol
如果它是一个链接器错误,.c
并且.m
因为Objective-C没有经过名称修改.
在文件CarArray(没有任何扩展名)中我有这样的数组(这是一个非常简化的版本):
NSString *cars[5][3] = {
{@"1A", @"1B", @"1C"},
{@"2A", @"2B", @"2C"},
{@"3A", @"3B", @"3C"},
{@"4A", @"4B", @"4C"},
{@"5A", @"5B", @"5C"}
}
Run Code Online (Sandbox Code Playgroud)
现在我想从多个文件中读取数组中的数据,所以我只是使用 #import "CarArray"
我用一个循环来读取数据.然后我得到这样一个错误:
duplicate symbol _cars in:
/Users/Adam/Library/Developer/Xcode/DerivedData/Auto_Center-hgjlsqanvyynncgyfzuorxwchqov/Build/Intermediates/Auto Center.build/Debug-iphonesimulator/Auto Center.build/Objects-normal/i386/DetailViewController.o
/Users/Adam/Library/Developer/Xcode/DerivedData/Auto_Center-hgjlsqanvyynncgyfzuorxwchqov/Build/Intermediates/Auto Center.build/Debug-iphonesimulator/Auto Center.build/Objects-normal/i386/ModelListViewController.o
ld: 1 duplicate symbol for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?