这些函数是我的大多数程序对象将使用的实用程序类型的东西.我希望将它们放在命名空间中并使它们具有全局性.此命名空间在标头中定义,然后添加到我的预编译标头中.但是到目前为止,我已经在2个不同的对象中使用了这个命名空间中的函数,并且编译器在这两个对象上抛出了多次定义的符号错误.
命名空间文件
#ifndef UTILS_H
#define UTILS_H
#include <random>
#include <cmath>
namespace Utils
{
extern int GetRandomBetween(int low, int high)
{
if (low < 0 || low >= high)
return 0;
int seed = high - low;
return (rand() % seed) + low;
}
};
#endif
Run Code Online (Sandbox Code Playgroud)
和我的precomp标题
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//
#pragma once
#include "targetver.h"
//#define WIN32_LEAN_AND_MEAN // Exclude …Run Code Online (Sandbox Code Playgroud) I'm getting an "unresolved external symbol "public:__thiscall hijo<int>::hijo<int>(void)" referenced in function_main
Run Code Online (Sandbox Code Playgroud)
我开始了一个新项目,因为我在另一个更大的项目上遇到了同样的错误.当我尝试使用new关键字分配空间时发生错误.如果这个错误是愚蠢请原谅我因为我在过去几个月没有编程.
/********************file hijo.h******************/
#pragma once
#ifndef hijo_h
#define hijo_h
template <class A>
class hijo
{
public:
hijo(void);
~hijo(void);
};
#endif
/********************file hijo.cpp***************/
#include "hijo.h"
#include <iostream>
using namespace std;
template <class A>
hijo<A>::hijo(void)
{
}
template <class A>
hijo<A>::~hijo(void)
{
}
/*********************at main() function ***************/
#include <iostream>
#include "hijo.h"
int main(){
hijo<int> *h = new hijo<int>; <---- PROBLEM AT THIS LINE
system("pause");
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我有一个win 32项目,我正在努力,资源文件工作正常,直到昨天.现在当我尝试打开资源文件进行编辑时,它会崩溃并给我以下错误:
C://program files/Microsoft SDKs/Windows/v6.0A/include/prsht.h(0)
error RC2247: Symbol name too long
Run Code Online (Sandbox Code Playgroud)
任何人都可以告诉我可能出错的地方或在哪里调查.rc文件是一个非常简单的对话框,带有静态文本和进度条.
我已经创建了几个月的应用程序,突然Xcode 5不想构建它.它只是抱怨以下错误.
Ld build/Debug-iphonesimulator/appname.app/appname normal i386
cd /Users/myname/proyectos/appname/dev/iOS/appname
setenv IPHONEOS_DEPLOYMENT_TARGET 5.1
setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin"
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -arch i386 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator7.0.sdk -L/Users/myname/proyectos/appname/dev/iOS/appname/build/Debug-iphonesimulator -L\"/Users/myname/proyectos/appname/dev/iOS/appname/appname/External/FlurryAnalytics\" -L\"/Users/myname/proyectos/appname/dev/iOS/appname/appname/External/SmartADServer\" -L\"/Users/myname/proyectos/appname/dev/iOS/appname/appname/External/TestFlight\" -F/Users/myname/proyectos/appname/dev/iOS/appname/build/Debug-iphonesimulator -F/Users/myname/proyectos/appname/dev/iOS/appname/appname/External -filelist /Users/myname/proyectos/appname/dev/iOS/appname/build/appname.build/Debug-iphonesimulator/Appname.build/Objects-normal/i386/appname.LinkFileList -Xlinker -objc_abi_version -Xlinker 2 -fobjc-arc -fobjc-link-runtime -Xlinker -no_implicit_dylibs -mios-simulator-version-min=5.1 -weak_framework AdSupport -framework Security -framework MessageUI -framework Twitter -framework CoreLocation -weak_framework CoreMotion -framework AudioToolbox -framework AVFoundation -framework MediaPlayer -framework SystemConfiguration -framework MobileCoreServices -lz -framework CFNetwork -framework QuartzCore -framework UIKit -framework Foundation -framework CoreGraphics -lTestFlight -framework comScore -lFlurry -Xlinker -dependency_info -Xlinker /Users/myname/proyectos/appname/dev/iOS/appname/build/appname.build/Debug-iphonesimulator/Appname.build/Objects-normal/i386/appname_dependency_info.dat -o /Users/myname/proyectos/appname/dev/iOS/appname/build/Debug-iphonesimulator/appname.app/appname
ld: …Run Code Online (Sandbox Code Playgroud) 我正在探索Qt的单元测试框架,我注意到一件奇怪的事情 - 考虑到QString已经实现了相等运算符const char *,我本来希望QCOMPARE(QString("1"), "1")它可以工作,但它会导致链接器错误:
tst_untitled14test.obj:-1: error: LNK2019: unresolved external symbol "bool __cdecl QTest::qCompare<class QString,char const [2]>(class QString const &,char const (&)[2],char const *,char const *,char const *,int)" (??$qCompare@VQString@@$$BY01$$CBD@QTest@@YA_NABVQString@@AAY01$$CBDPBD22H@Z) referenced in function "private: void __thiscall Untitled14Test::testCase1(void)" (?testCase1@Untitled14Test@@AAEXXZ)
Run Code Online (Sandbox Code Playgroud)
示例代码:
QVERIFY(QString("1") == "1"); // This works.
QCOMPARE(QString("1"), QString("1")); // This works.
// QCOMPARE(QString("1"), "1"); // Causes a linker error!
Run Code Online (Sandbox Code Playgroud)
这是为什么?不QCOMPARE使用2项的等式运算符?
编辑:由于在评论中询问,该项目是由Qt Creator的单元测试向导(文件 - >新项目 - >其他项目 - > Qt单元测试)创建的,所以当然它已经正确设置,并QT += testlib包含在内.
我在Visual Studio中创建的asm项目调用C函数时遇到问题(Win10 x64,Visual Studio 2015).项目由一个asm文件组成:
.586
.model flat, stdcall
option casemap:none
includelib msvcrt.lib
ExitProcess PROTO return:DWORD
extern printf:near
.data
text BYTE "Text", 0
.code
main PROC
push offset text
call printf
add esp,4
invoke ExitProcess,0
main ENDP
end main
Run Code Online (Sandbox Code Playgroud)
当我构建项目时,链接器输出错误:
错误LNK2019未解析的函数_main @ 0中引用的外部符号_printf
链接器输出参数:
/OUT:"C:\Users\apple\Documents\SP_Lab7\Debug\SP_Lab7_Demo.exe"/ MANIFEST:NO/NXCOMPAT /PDB:"C:\Users\apple\Documents\SP_Lab7\Debug\SP_Lab7_Demo.pdb"/ DYNAMICBASE "kernel32.lib""user32.lib""gdi32.lib""winspool.lib""comdlg32.lib""advapi32.lib""shell32.lib""ole32.lib""oleaut32.lib""uuid.lib" "odbc32.lib""odbccp32.lib"/ MACHINE:X86/SAFESEH:NO/INCREMENTAL:NO /PGD:"C:\Users\apple\Documents\SP_Lab7\Debug\SP_Lab7_Demo.pgd"/ SUBSYSTEM:WINDOWS/MANIFESTUAC: "level ='asInvoker'uiAccess ='false'"/ ManifestFile:"Debug\SP_Lab7_Demo.exe.intermediate.manifest"/ ERRORREPORT:PROMPT/NOLOGO/TLBID:1
如果我发表评论call print,那么一切都正常执行(甚至是Windows API函数).有没有办法从asm文件调用C函数而不创建包含的cpp文件<cstdio>?有可能吗?
在一个静态库项目中,我有一个带声明但未实现的函数的头文件.
我有一个实现这些功能的.cpp文件.
然后,为了更好地理解链接器错误,我复制了cpp文件,所以我有一个完全重复的它也被编译.因此,两个文件都有标头中每个符号的双重实现.
它编译,当在另一个项目中使用时,它会链接.
这是静态库的最小示例:
api.hpp:
void printWhatever();
Run Code Online (Sandbox Code Playgroud)
errortest.cpp和duplicate.cpp是相同的:
#include "api.hpp"
#include <iostream>
void printWhatever(){
std::cout << "hi " << "\n";
}
Run Code Online (Sandbox Code Playgroud)
我将其编译为包含这两个源文件的静态库.我看到编译器为两个文件生成报告.
现在我在一个可执行文件中使用这个编译库,一个不同的项目:main.cpp:
#include <api.hpp>
int main(int argc, const char * argv[]) {
printWhatever();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它运行并打印"hi".
为什么函数没有多重定义?
我正在运行 Ubuntu 18.04.1 LTS,并尝试让 Half Life 的游戏库在 Xash3D 引擎中运行。它们构建正常,但是当我尝试运行引擎时,我收到以下令人困惑的错误:
undefined symbol: _ZTVN10__cxxabiv120__si_class_type_infoE
Run Code Online (Sandbox Code Playgroud)
经过一些互联网研究后,我认为这基本上可以解决“VTable for __cxxabiv1::__si_class_type_info”。我已经安装了libc++abi-dev、libc++-dev、libc++abi1以及libc++1它们的 i386 对应版本(因为我必须以 32 位进行编译),所以我不知道为什么运行时链接会失败。
如果有帮助的话,我发现半条命存储库中的其他库(特别是死亡竞赛经典库)也可以工作。我检查了 makefile,DMC 库没有任何LDFLAGS设置,而标准的 Half Life 库使用:
LDFLAGS= -lm -lstdc++
Run Code Online (Sandbox Code Playgroud)
有什么原因导致我在这里收到链接器错误吗?我可以做什么来修复它们?
编辑:我正在使用 GCC/G++ 7.3.0。如果有帮助,我正在使用的库的 makefile 在这里:
有效的:https://github.com/ValveSoftware/halflife/blob/master/linux/Makefile.dmcdll
没有的:https://github.com/ValveSoftware/halflife/blob/master/linux/Makefile.hldll
我还在*_map.txt编译生成的文件中搜索了“libc”。这就是现在的情况:
在工作 DMC 映射文件中:
Archive member included to satisfy reference by file (symbol)
/usr/lib/i386-linux-gnu/libc_nonshared.a(stack_chk_fail_local.oS)
/home/vesper/Documents/afterburner-game/build/game/obj/dmcdll/animating.o (__stack_chk_fail_local)
As-needed library included to satisfy reference by file (symbol)
libstdc++.so.6 /home/vesper/Documents/afterburner-game/build/game/obj/dmcdll/nodes.o (operator new[](unsigned …Run Code Online (Sandbox Code Playgroud) 我正在尝试将开源库libsndfile与 Android NDK 交叉编译。我的主机是 Windows 10 下的 Ubuntu 子系统,目标是 Android 系统(目前任何人都会这样做)。对于构建,我使用 autogen+configure 设置,如 libsndfile文档中所述。编译在链接阶段停止,生成一个冗长的日志文件(略多于 400 行),其中包含多个错误。开始时的错误似乎并不重要,但请配置探测编译器设置,如 本文所述。最后一条错误消息指向链接器问题。我认为这是日志文件的相关摘录:
#include "..." search starts here:
#include <...> search starts here:
/home/alan/android-ndk-r18/toolchains/llvm/prebuilt/linux-x86_64/lib64/clang/7.0.2/include
End of search list.
"/usr/bin/ld" --sysroot=../android-ndk-r18/platforms/android-17/arch-arm -z relro -X --enable-new-dtags --eh-frame-hdr -m armelf_linux_eabi -dynamic-linker /system/bin/linker -o a.out ../android-ndk-r18/platforms/android-17/arch-arm/usr/lib/../lib/crtbegin_dynamic.o -L../android-ndk-r18/platforms/android-17/arch-arm/usr/lib -L../android-ndk-r18/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/lib -L/home/alan/android-ndk-r18/toolchains/llvm/prebuilt/linux-x86_64/lib64/clang/7.0.2/lib/linux/arm -L../android-ndk-r18/platforms/android-17/arch-arm/usr/lib/../lib -L../android-ndk-r18/platforms/android-17/arch-arm/usr/lib /tmp/conftest-5c2dd3.o -lgcc -ldl -lc -lgcc -ldl ../android-ndk-r18/platforms/android-17/arch-arm/usr/lib/../lib/crtend_android.o
/usr/bin/ld: unrecognised emulation mode: armelf_linux_eabi
Supported emulations: elf_x86_64 elf32_x86_64 elf_i386 elf_iamcu i386linux elf_l1om elf_k1om i386pep i386pe
clang: …Run Code Online (Sandbox Code Playgroud) 我正在尝试构建 Fortran 程序,但收到有关未定义引用或未解析的外部符号的错误。我看到了有关这些错误的另一个问题,但那里的答案大多特定于 C++。
使用 Fortran 编写时出现这些错误的常见原因是什么?如何修复/预防它们?
这是构建 Fortran 程序时出现的一系列错误的典型问题。如果您被推荐到这里,或者您的问题作为与此问题重复的问题而被关闭,您可能需要阅读几个答案中的一个或多个。从这个答案开始,它充当所提供解决方案的目录。
fortran linker-errors unresolved-external undefined-reference
linker-errors ×10
c++ ×5
linker ×2
android ×1
android-ndk ×1
assembly ×1
fortran ×1
inheritance ×1
ios ×1
ld ×1
libc++ ×1
linux ×1
masm ×1
qt ×1
templates ×1
ubuntu-18.04 ×1
unit-testing ×1
visual-c++ ×1
winapi ×1
windows ×1
x86 ×1
xcode ×1