在WSL上链接时函数调用错误



我有一个正在用C++开发的项目。构建文件是使用GN和Clang创建的。但问题是我无法从GN创建可执行的main。您可以查看下面定义的函数以供参考。

添加cpp

#include "pch.h"
#include "framework.h"
#include "add.h"
#include<iostream>
void A::add1(int a,int b)
{
std::cout<<"The value of A is "<<a<<" and the value of B is"<<b<<" and thier sum is"<<a+b<<std::endl;
}

Sub.cpp

#include "pch.h"
#include "framework.h"
#include "sub.h"
#include<iostream>
void check::sub1(int a,int b)
{
std::cout<<"A-B is "<<a-b<<std::endl;
}

以及类似的乘法函数和除法函数。

pch函数定义为:-

#ifndef PCH_H
#define PCH_H
#define BUILDING_DLL_LIB 
#include "framework.h"
#endif

框架功能:-

#if defined(_MSC_VER) // Microsoft compiler
#include <windows.h>
#elif defined(__GNUC__) // GNU compiler
#include <dlfcn.h>
#endif

Main:-

#include<iostream>
#include "../add/SampleDll.h"
#include "../add/add.h"
#include "../sub/sub.h"
#include "../mul/mul.h"
#include "../div/div.h"
int main()
{
CSampleDll obj;
A obj1;
check obj2;
C obj3;
D obj4;
obj1.add1(10,5);
obj2.sub1(10,5);
obj3.mul1(10,5);
obj4.div1(10,5);
}

但问题是,当使用gn构建文件时,我在linux上收到了这个错误:-

clang++ -pthread -rdynamic -fopenmp -Wl,-rpath-link= -Wl,--no-undefined -Wl,--strip-discarded -Wl,--gc-sections -m64 -o ./main @main.rsp
/usr/bin/ld: obj/main/main.o: in function `main':
/mnt/d/test/dll_so/out/../main/main.cpp:9: undefined reference to `CSampleDll::CSampleDll()'
/usr/bin/ld: /mnt/d/test/dll_so/out/../main/main.cpp:16: undefined reference to `A::add1(int, int)'
/usr/bin/ld: /mnt/d/test/dll_so/out/../main/main.cpp:17: undefined reference to `check::sub1(int, int)'
/usr/bin/ld: /mnt/d/test/dll_so/out/../main/main.cpp:18: undefined reference to `C::mul1(int, int)'
/usr/bin/ld: /mnt/d/test/dll_so/out/../main/main.cpp:19: undefined reference to `D::div1(int, int)'
/usr/bin/ld: /mnt/d/test/dll_so/out/../main/main.cpp:20: undefined reference to `CSampleDll::~CSampleDll()'
/usr/bin/ld: /mnt/d/test/dll_so/out/../main/main.cpp:20: undefined reference to `CSampleDll::~CSampleDll()'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.

正在为每个函数正确创建共享库,但在链接时,我遇到了上述错误。为main执行的命令是:-

clang++ -g -Wl,/debug -Wl,/ignore:4099 -Wl,/dynamicbase -Wl,/subsystem:console -Wl,/nxcompat -Wl,/safeseh:no -Wl,/nodefaultlib:libcmt.lib -Wl,/incremental -Wl,/machine:x64 -m64 -o ./main.exe @main.exe.rsp ./add.lib ./sub.lib ./mul.lib ./div.lib -lmsvcrt.lib -lgdi32.lib -lshell32.lib -ladvapi32.lib -ldelayimp.lib -lBcrypt.lib -loldnames.lib 

此外,我尝试在WindowsSubsytemforlinux(WSL(中使用LIBRARY_PATH设置路径,使用:-

LIBRARY_PATH=/mnt/path/to/lib
export LIBRARY_PATH

当上述LIBRARY_PATH不起作用时,我使用:-尝试了LD_LIBRARY_PATH

LD_LIBRARY_PATH=/mnt/path/to/lib::$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/mnt/path/to/lib:$LD_LIBRARY_PATH

WSL什么都不起作用,我很困惑自己哪里错了。请帮忙,我们将不胜感激。

附言-以上项目正在开发windows

我们缺少一些线索信息。

但看起来你在链接lib时遇到了问题,如果你有时有多余的时间,你可能想尝试制作一个MakeFile来编译所有这些代码。或者开始做一个CMake来澄清事情。

大多数时候,windows和linux之间的编译是不同的,如果不使用任何基于windows的命令,您可能需要进行搜索。

最后,WLS可能有点反复无常,如果你认为这不是你的代码和编译,我建议你在虚拟机或双启动中尝试

最新更新