O que há de errado com o seguinte código em c++, usando a boost thread:
#include <iostream>
#include "Leitor.h"
#include "boost/thread.hpp"
void f(){
std::cout << "na thread nova" << std::endl;
}
int main(int argc, char **argv) {
std::cout << "main" << std:: endl;
boost::thread t (f);
t.join();
return 0;
}
O código compila normal mas não executa. Simplesmente não imprime nada. Nem erro, nada. Tentei envolver o código do main em um try catch, com um cout << "erro"; no catch e tbm não imprime nada. Foi compilado com gcc 4.6.1 do minGW, Windows 7, boost 1.47, com a opção -l libboost_thread-mgw46-mt-d-1_47 para o gcc. Alguém (vinyGodoy, por exemplo, hehe) ?
Uai, rodei seu programa e funcionou direitinho (acho que no caso do mingw você precisa também acrescentar um cout.flush() - não preciso disso no Microsoft Visual C++ mas eu sei que normalmente no Linux/Unix você precisa dar um “flush” no cout)
#include <iostream>
#include <boost/thread.hpp>
void f(){
std::cout << "na thread nova" << std::endl;
}
int main(int argc, char *argv[]) {
std::cout << "main" << std::endl;
boost::thread t (f);
t.join();
std::cout.flush();
return 0;
}
Saída
main
na thread nova
O que usei para compilar
C>cl -EHsc -Ic:\boost_1_39_0 testethread.cpp /link /libpath:c:\boost_1_39_0\Win32\lib
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
testethread.cpp
Microsoft (R) Incremental Linker Version 8.00.50727.762
Copyright (C) Microsoft Corporation. All rights reserved.
/out:testethread.exe
/libpath:c:\boost_1_39_0\Win32\lib
testethread.obj
Então, meu código original tbm já tinha um flush no cout, só tirei pra postar aqui…e continua sem imprimir nada…
O que me preocupa é isso aqui:
If you plan to use your tools from the Windows command prompt, you’re in the right place. If you plan to build from the Cygwin bash shell, you’re actually running on a POSIX platform and should follow the instructions for getting started on Unix variants. Other command shells, such as MinGW’s MSYS, are not supported?they may or may not work.
Pra ser sincero não sei bem se esse é meu caso…só sei q tenho o MinGW e o Msys instalados, e estou compilando o código com o gcc do MinGW, q na verdade invoco usando o Eclipse…
Acho que “resolvi”…o que percebi é que no meu diretório “lib” da boost tem dois arquivos com o mesmo nome só que com extensões diferentes: .a e .dll. Tive a ideia de sair do eclipse e executar na mão o .exe gerado…ele me deu a feliz mensagem q o arquivo .dll estava faltando…copiei o arquivo na system32 e vualá…agora o treco todo funciona…
o que me preocupa, já que pra executar em outras máquinas terei de fazer o mesmo suponho eu…e vai saber se o arquivo .dll vai ser “compatível” em outras máquinas…
será que to vacilando em algo, alguma configuração q torne esse processo automático?
Há um bug na boost::thread que faz com que você seja obrigado a usar a versão DLL (não LIB) se não quiser ter alguns erros muito esquisitos.
Portanto, você será obrigado a distribuir essa DLL juntamente com seu código.
Você terá de criar um instalador para seu programa, ou no mínimo deixar a DLL no mesmo diretório do seu EXE, e testar em algumas máquinas - por exemplo, Windows / 32 bits, Windows / 64 bits, Windows 7, Windows Vista, Windows XP …
[quote=entanglement]Há um bug na boost::thread que faz com que você seja obrigado a usar a versão DLL (não LIB) se não quiser ter alguns erros muito esquisitos.
Portanto, você será obrigado a distribuir essa DLL juntamente com seu código.
Você terá de criar um instalador para seu programa, ou no mínimo deixar a DLL no mesmo diretório do seu EXE, e testar em algumas máquinas - por exemplo, Windows / 32 bits, Windows / 64 bits, Windows 7, Windows Vista, Windows XP …
[/quote]
puxa…que desgraça…com todas as letras…
Aproveitando o tópico e a boa vontade…no diretório lib da boost tenho diversas opções de thread pra escolher…os nomes diferem nas letras finais antes da extensão…
sabe dizer a diferença entre cada um desses aí (vide imagem anexa)?
mgw46 = MinGW 4.6
mt = Multi-threaded
1_47 = Boost 1.47
s = static linking
d = debug
sd = static debug
.dll.a = biblioteca de imports para a .dll
.a = biblioteca estática simples