将本地共享库与Waf链接(无库编译)
Linking local shared library with Waf (no lib compilation)
我正在尝试使用waf-1.8.8构建一个简单的c++11
程序,该程序链接到一个共享的lib(动态库)。
特殊之处在于,我没有试图构建这个lib,因为我已经有了dev版本,这意味着声明(.hpp头)和定义(linux
下的.so
文件,windows下的.dll
+.lib
)。
我只是想这样链接:
$ g++ src/main.cpp -o mySFMLprogram.bin -std=c++11 -IthirdParty/SFML-2.2/include -LthirdParty/SFML-2.2/lib -lsfml-graphics -lsfml-system -lsfml-window
从我项目的基本目录来看,这非常有效。
不起作用的是使用wscript/waf系统。。。我不知道如何使其等效于-LthirdParty/SFML-2.2/lib
(为链接器提供一个新的搜索目录,man gcc
表示Add directory dir to the list of directories to be searched for -l.
)。
以下是我项目的简化树:
$ tree
.
├── src
│ ├── main.cpp
│ └── wscript
├── thirdParty
│ ├── SFML-2.2
│ │ ├── include
│ │ │ └── SFML
│ │ │ ├── Audio
│ │ │ │ └── **.hpp
│ │ │ ├── Audio.hpp
│ │ │ ├── Config.hpp
│ │ │ ├── Graphics
│ │ │ │ └── **.hpp
│ │ │ ├── Graphics.hpp
│ │ │ ├── Main.hpp
│ │ │ ├── Network
│ │ │ │ └── **.hpp
│ │ │ ├── Network.hpp
│ │ │ ├── OpenGL.hpp
│ │ │ ├── System
│ │ │ │ ├── **.hpp
│ │ │ │ └── **.inl
│ │ │ ├── System.hpp
│ │ │ ├── Window
│ │ │ │ └── **.hpp
│ │ │ └── Window.hpp
│ │ └── lib
│ │ ├── libsfml-audio.so -> libsfml-audio.so.2.2.0
│ │ ├── libsfml-audio.so.2.2.0
│ │ ├── libsfml-graphics.so -> libsfml-graphics.so.2.2.0
│ │ ├── libsfml-graphics.so.2.2.0
│ │ ├── libsfml-network.so -> libsfml-network.so.2.2.0
│ │ ├── libsfml-network.so.2.2.0
│ │ ├── libsfml-system.so -> libsfml-system.so.2.2.0
│ │ ├── libsfml-system.so.2.2.0
│ │ ├── libsfml-window.so -> libsfml-window.so.2.2.0
│ │ └── libsfml-window.so.2.2.0
│ └── wscript
├── waf
└── wscript
编辑:在@mkaes第一次解释后更新我的文件根wscript
是:
#! /usr/bin/env python
# encoding: utf-8
import os
VERSION = "0.1"
APPNAME = "wafTest"
def options(opt):
opt.load('compiler_cxx')
def configure(cfg):
cfg.load('compiler_cxx')
cfg.LIB_SFML = ['sfml-graphics', 'sfml-system', 'sfml-window']
cfg.INCLUDES_SFML = ['thirdParty/SFML-2.2/include')]
cfg.LIBPATH_SFML = ['thirdParty/SFML-2.2/lib')]
cfg.check(
features='cxx cxxprogram',
cxxflags=['-std=c++11', '-Wall'],
)
def build(bld):
bld.recurse('src')
src
wscript
为:
#! /usr/bin/env python
# encoding: utf-8
def build(bld):
#EDIT removed bld(name = 'sfml-graphics', export_includes = '../thirdParty/SFML-2.2/include')
#EDIT removed bld(name = 'sfml-window', export_includes = '../thirdParty/SFML-2.2/include')
#EDIT removed bld(name = 'sfml-system', export_includes = '../thirdParty/SFML-2.2/include')
bld.program(
features='cxx cxxprogram', #is it an option ?
source='main.cpp',
target='app',
use = ['SFML'], #first try> compilation error, headers missing
includes = '../thirdParty/SFML-2.2/include' #second try> link error, lib missing
)
src/main.cpp
的源代码(很容易从SFML基本测试程序中获取):
#include <SFML/Graphics.hpp>
int main()
{
// create the window
sf::RenderWindow window(sf::VideoMode(800, 600), "My window");
// run the program as long as the window is open
while (window.isOpen())
{
// check all the window's events that were triggered since the last iteration of the loop
sf::Event event;
while (window.pollEvent(event))
{
// "close requested" event: we close the window
if (event.type == sf::Event::Closed)
window.close();
}
// clear the window with black color
window.clear(sf::Color::Black);
// draw everything here...
// window.draw(...);
// end the current frame
window.display();
}
return 0;
}
waf命令./waf clean configure build
:的先前输出
'clean' finished successfully (0.004s)
Setting top to : /home/***/Documents/dev/wafTest
Setting out to : /home/***/Documents/dev/wafTest/build
Checking for 'g++' (C++ compiler) : /usr/bin/g++
Checking for compiler flags ['-std=c++11', '-Wall'] : yes
'configure' finished successfully (0.070s)
Waf: Entering directory `/home/***/Documents/dev/wafTest/build'
[1/2] Compiling src/main.cpp
[2/2] Linking build/src/app
src/main.cpp.4.o: dans la fonction « main »:
main.cpp:(.text+0x10f): référence indéfinie vers « sf::String::String(char const*, std::locale const&) »
main.cpp:(.text+0x12d): référence indéfinie vers « sf::VideoMode::VideoMode(unsigned int, unsigned int, unsigned int) »
main.cpp:(.text+0x160): référence indéfinie vers « sf::RenderWindow::RenderWindow(sf::VideoMode, sf::String const&, unsigned int, sf::ContextSettings const&) »
main.cpp:(.text+0x19b): référence indéfinie vers « sf::Window::close() »
main.cpp:(.text+0x1b4): référence indéfinie vers « sf::Window::pollEvent(sf::Event&) »
main.cpp:(.text+0x1c8): référence indéfinie vers « sf::Color::Black »
main.cpp:(.text+0x1d0): référence indéfinie vers « sf::RenderTarget::clear(sf::Color const&) »
main.cpp:(.text+0x1df): référence indéfinie vers « sf::Window::display() »
main.cpp:(.text+0x1ee): référence indéfinie vers « sf::Window::isOpen() const »
main.cpp:(.text+0x206): référence indéfinie vers « sf::RenderWindow::~RenderWindow() »
main.cpp:(.text+0x23f): référence indéfinie vers « sf::RenderWindow::~RenderWindow() »
main.cpp:(.text+0x270): référence indéfinie vers « sf::RenderWindow::~RenderWindow() »
collect2: error: ld returned 1 exit status
Waf: Leaving directory `/home/***/Documents/dev/wafTest/build'
Build failed
-> task in 'app' failed (exit status 1):
{task 140412749536784: cxxprogram main.cpp.4.o -> app}
['/usr/bin/g++', 'src/main.cpp.4.o', '-o', '/home/***/Documents/dev/wafTest/build/src/app', '-Wl,-Bstatic', '-Wl,-Bdynamic']
怎么了?
第2版:这个例子是SOLVED,可以在Github上找到:https://github.com/Tyrben/SFMLProjectUsingWaf感谢@mkaes
解决此问题的一种方法是在配置阶段添加库。E.g
cfg.env.LIB_SFML = ['sfml-graphics', 'sfml-system', 'sfml-window']
cfg.env.LIBPATH_SFML = [os.path.join(os.getcwd(), 'thirdParty/SFML-2.2/lib')]
cfg.env.INCLUDES_SFML = [os.path.join(os.getcwd(), 'thirdParty/SFML-2.2/include']
然后在构建中添加SFML
作为use
指令。
更新:将您的构建更改为:
def build(bld):
bld.program(
features='cxx cxxprogram', #is it an option ?
source='main.cpp',
target='app',
use = ['SFML']
)
相关文章:
- Visual Studio 2017 ARM 交叉编译链接器崩溃
- CGAL 编译/链接器错误
- opencv 3.0 Visual Studio Community 2017 编译链接错误
- 在 Linux 中编译/链接多个 C++ 库
- 加速极慢的 MinGW-w64 编译/链接?
- Xcode - 如何使用"-fexhaustive-register-search"进行编译 - 链接器崩溃需要
- 交叉编译:链接时对std::__atomic_futex_unsigned_base::_M_futex_notify_
- 无法从单独的.cpp使用模板化成员编译/链接类
- 交叉编译链接器错误
- Eclipse C/C++:外部库的交叉编译链接器错误:Ubuntu VM amd64 to Ubuntu armhf
- 编译/链接 C 和 C++ 文件时出现问题
- C++编译链接
- 如何正确编译/链接Linux Makefile中的单元测试
- 在以下程序中获取编译链接错误
- 与Boost日志进行交叉编译链接期间未解决的符号
- 如何编译/链接Boost与clang++/libc++
- Cef项目编译链接error2001
- 我如何编译/链接测试用例(googleTest)使用cmake的代码捆绑在共享库
- 编译链接
- 编译/链接过程是如何工作的