2015-04-23 4 views
1

Я пытаюсь создать простую программу c++11, связанную с общей библиотекой lib (dynamic library) с использованием waf-1.8.8.Связывание локальной общей библиотеки с Waf (без компиляции lib)

Особенности является то, что я не пытаюсь строить эту библиотеку, потому что у меня уже есть версия Dev, что означает, что декларации (.hpp заголовки) и определение (.so файлов в linux, .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 

EDIT: обновить мои файлы после @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') 

И srcwscript является:

#! /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'] 

Что случилось?

EDIT2: Этот пример решаемый и может быть найден на Github: https://github.com/Tyrben/SFMLProjectUsingWaf Благодаря @mkaes

ответ

1

Один из способов решить эту проблему можно было бы добавить вашу библиотеку на этапе конфигурирования. Например

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 директивы.

Update: Изменить сборку на это:

def build(bld): 
    bld.program(
     features='cxx cxxprogram', #is it an option ? 
     source='main.cpp', 
     target='app', 
     use = ['SFML'] 
) 
+0

извините, это не работает для меня. Я получаю много ошибок ссылок, например 'main.cpp :(. Text + 0x270): неопределенная ссылка на« sf :: RenderWindow :: ~ RenderWindow() » collect2: error: ld возвращен 1 статус выхода' Я отредактирую свое сообщение чтобы показать файлы wscript. – Sandburg

+0

Довольно странно, поскольку это работает для меня для одного и того же варианта использования. Можете ли вы также добавить вывод командной строки из waf? – mkaes

+0

Я добавил вывод. ID: он говорит Waf: Ввод каталога '/ home/nounours/Documents/dev/wafTest/build ', так что, возможно, у него есть не все заголовки lib и.поэтому в сборке subdir?! – Sandburg

Смежные вопросы