我有一个正在用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可能有点反复无常,如果你认为这不是你的代码和编译,我建议你在虚拟机或双启动中尝试