Setting up ZeroMQ in a Visual Studio '13 Project - c++

I'm trying to get ZeroMQ to work with my C++ project. I want to do the ZeroMQ Hello World tutorial, shown below:
// Hello World server
#include <zmq.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
int main (void)
{
// Socket to talk to clients
void *context = zmq_ctx_new ();
void *responder = zmq_socket (context, ZMQ_REP);
int rc = zmq_bind (responder, "tcp://*:5555");
assert (rc == 0);
while (1) {
char buffer [10];
zmq_recv (responder, buffer, 10, 0);
printf ("Received Hello\n");
sleep (1); // Do some 'work'
zmq_send (responder, "World", 5, 0);
}
return 0;
}
However, whenever I try to compile and run it, Visual Studio says it can't find zmq.h or any of the ZeroMQ methods I am using. I already installed ZeroMQ from http://zeromq.org/distro:microsoft-windows, what else do I have to do to get it to work?

Including the headers:
Right click Project -> Properties -> C/C++ -> General
Edit 'Additional Include Directories'
Add C:\Program Files\ZeroMQ 4.0.4\include
Right click 'Header Files' -> Add -> Existing Item -> C:\Program Files\ZeroMQ 4.0.4\include\zmq.h
Adding the library dir:
Right click Project -> Properties -> Linker -> General
Edit 'Additional Library Directories'
Add C:\Program Files\ZeroMQ 4.0.4\lib\
Linking to the proper library:
Right click Project -> Properties -> General
Check "Platform Toolset", notice the version number (ex: v120)
Configuration Properties -> Linker -> Input
Edit 'Additional Dependencies'
Add appopriate toolset library (ex: libzmq-v120-mt-gd-4_0_4.lib) "-gd-" is the debug version
Ensure your app is 64-bit
Build -> Configuration Manager
Active solution platform -> New...
Select x64
Copy settings from Win32
Right click Project -> Properties -> Linker -> All Options
Edit "Output File" set to ".\x64\Debug\whatever.exe"
Include the pre-compiled dll as a resource for distribution
Right click Project -> Properties -> Build Events -> Post-Build Event
Edit "Command Line"
insert copy command
ex:
copy /Y "C:\Program Files\ZeroMQ 4.0.4\bin\libzmq-v120-mt-gd-4_0_4.dll" "$(OutDir)"

You should download and install 0MQ first.
Then you will be able to configure your Project properties to point to the right include and lib paths.

Related

Separate dll from other output files in c++ projects

I have a few dll projects in a solution (some depending on each other)
Project1 -> Properties -> Linker -> Input -> Additional Dependencies -> Project2.lib
Project1 -> Properties -> Linker -> General -> Additional Library Directories -> $(OutDir)
All is working fine.
Projects are Win7Debug Win32, Win7Debug x64..... and a Win32 project with only Debug and Release configurations.
I would like to have all dll's for Win32 placed in one folder and the x64 ones in another folder. So I added the x64 configuration for the Win32 project, and changed
Project1 -> Properties -> Linker -> General -> Output File -> $(SolutionDir)/i386/$(TargetName)/$(TargetExt)
(for Win32 - similar change for x64)
all seemed fine - and I only received dlls in the i386 folder... until I had to rebuild and got
Warning 23 warning MSB8012:
TargetPath(C:\Path\Win7Debug\Project1.dll) does not match the Linker's OutputFile
property value (C:\Path\i386\Project1.dll). This may cause your project to build
incorrectly. To correct this, please make sure that $(OutDir), $(TargetName) and
$(TargetExt) property values match the value specified in %(Link.OutputFile).
This seems serious... and I don't want to have problems with missing dependencies (though everything seems to be working fine - and not just on my machine)
I changed
Project1 -> Properties -> Configuration Properties -> General -> OutputDirectory -> $(SolutionDir)/i386
(to match the linker output) but now of course I get lib and exp files in the same folder as the dll's.
Other than using post build script, is there a way to separate the output files ?
Should I just leave the settings how I had them and disregard the warning above ?
Note: I am not trying to separate the Platform/configuration output files... That is done automagically using the default output directory.
What I need is, for each platform, to place only DLL files in one folder away from anything else. Redirecting Linker output (and leaving project output to standard) accomplishes that - I just am not sure if it is correct. Logically I should not have any build problems since I am giving linker all the info it needs...
The standard approach is to leave all these properties unchanged (inherit from parent). In this case linker will create DLL and LIB in $(Output) directory, which by default is $(SolutionDir)$(Configuration).
You just specify the name for x64 configuration, and all output files will be separated automatically.
The standard (and the easest) way to link import library is to add reference to corresponding project in Common Properties / References page. Nothing else is required.
If, for any reason, it is impossible, add $(SolutionDir)$(Configuration) to Configuration Properties / VC++ Directories / Library Directories and add library to be linked to Linker / Additional Dependencies. If there are many projects in your solution, you may create Property Sheet for the solution and specify Library Directories only once.

Setting gcc ( gcc-arm-embedded ) in Eclipse IDE for C/C++ Developers Mars in OS X

I am a newbie in Eclipse IDE for C/C++ .
I want to set gcc-arm-embedded in Eclipse IDE for C/C++ Developers Mars Milestone 4 (4.5.0M4), I just downloaded https://launchpad.net/gcc-arm-embedded/+download, and now I guess that I have to set PATH somewhere in Eclipse, as I am experiencing this ERRORs in 1 project
Program "arm-none-eabi-g++" not found in PATH
Program "arm-none-eabi-gcc" not found in PATH
The location of the error is in
Project Properties -> C / C++ General -> Preprocessor Include Paths, Macros, etc -> Languages (GNU C) -> [ CDT GCC Built-in Compiler Settings Cross ARM]
But I can't edit this entry: "Setting entries for this provider are supplied by the system and are not editable"
I've tried with:
export PATH=$PATH:/Users/joanot/Development/gcc-arm-none-eabi-4_9-2014q4/bin
and in
Project Properties -> Paths and Symbols -> adding the directory /Users/joanot/Development/gcc-arm-none-eabi-4_9-2014q4/bin
and
In Eclipse -> Preferences -> C / C++ -> Build -> Build Variables:
Create 1 variable named GCC_EABI, type= Directory, value= /usr/local/gcc-arm-none-eabi-4_9-2014q4/bin
In Eclipse -> Preferences -> C / C++ -> Build -> Environment:
Add -> Name = PATH , value = ${GCC_EABI}
In case someone reads this later (like I just did) this works, however the real answer is here
Essentially you need to go to Eclipse -> Preferences -> C/C++ Build -> Tools Paths
Add the path (in my case /Users/${USER}/armtools/install/bin) to the Toolchain folder

Eclipse content assist doesn't recognize std::thread, but compiles correctly

I am running Ubuntu 14.04.
Steps I took to reproduce:
Create a new C++ project (New -> C++ -> Hello World project), which I called TestStdThread
Change the code in the main file to this:
#include <thread>
#include <iostream>
int main() {
std::cout << "You have " << std::thread::hardware_concurrency() << " cores." << std::endl;
return 0;
}
Go to TestStdThread -> Properties -> C/C++ Build -> Settings -> GCC C++ Compiler, and change the Command options from g++ to g++ -std=c++11
Go to TestStdThread -> Properties -> C/C++ Build -> Settings -> GCC C++ Compiler -> Includes, add /usr/include to the Include paths (-I), and add pthread.h to the Include files (-include)
Go to TestStdThread -> Properties -> C/C++ Build -> Settings -> GCC C++ Linker -> Libraries, add pthread to the Libraries (-l), and add /usr/lib/x86_64-linux-gnu to the Library search path (-L)
TestStdThread -> Build Project
Click "Run"
There were no build errors. Eclipse told me that the project had errors and asked if I wanted to run it anyway, and when I said yes, the output was, correctly: You have 4 cores.. However, Eclipse still underlined the std::thread::hardware_concurrency part in red, and reported it (on hover) as "Function 'hardware_concurrency' could not be resolved," and std::thread didn't show up when typing std:: Ctrl+Space.
This is the bash command I used to find where my pthread files were located within /usr (/usr/share omitted as it contains lots of doc files that I'm not looking for):
llama#llama-Satellite-E55-A:/usr$ find -name "*pthread*" -not -path "./share/*"
./include/pthread.h
./include/x86_64-linux-gnu/bits/pthreadtypes.h
./lib/x86_64-linux-gnu/pkgconfig/pthread-stubs.pc
./lib/x86_64-linux-gnu/libpthread.so
./lib/x86_64-linux-gnu/libpthread_nonshared.a
./lib/x86_64-linux-gnu/libgpgme-pthread.so.11.11.0
./lib/x86_64-linux-gnu/libgpgme-pthread.so.11
./lib/x86_64-linux-gnu/libpthread.a
./lib/perl/5.18.2/bits/pthreadtypes.ph
./lib/debug/lib/x86_64-linux-gnu/libpthread-2.19.so
Go to Project -> Properties -> C/C++ General -> Preprocessor include paths, etc -> Providers -> CDT GCC Builtin Compiler Settings and append -std=c++11 to the compiler specs.
You can also do this for all projects going to Window -> Preferences -> C/C++ -> Build -> Settings -> Discovery and append -std=c++11 to the CDT GCC Builtin Compiler Settings specs.
Make sure to reindex your project afterwards.
These instructions are for Eclipse Luna (4.4.0), for previous versions the paths are similar.

Set project configurations using Visual Studios custom template wizard

I am trying to create a C++ project template using the custom project wizard. I just need a simple template for an empty C++ CLI application that uses an external library, i.e I need the wizard to set the following settings found under Project -> Properties:
Configaration Setting -> VC++ Directories -> Executable Directories
Configaration Setting -> VC++ Directories -> Include Directories
Configaration Setting -> VC++ Directories -> Library Directories
Configaration Setting -> Linker -> Input -> Additional Dependencies
It seems I need to modify default.js more specifically the function AddConfig which contains:
function AddConfig(proj, strProjectName)
{
var config = proj.Object.Configurations('Debug');
var CLTool = config.Tools('VCCLCompilerTool');
// TODO: Add compiler settings
var LinkTool = config.Tools('VCLinkerTool');
// TODO: Add linker settings
}
I need help in setting the project settings here.

using googletest in eclipse: how?

I've downloaded google test, but now I've no idea on how to link it to my project in eclipse.
Should I add it as a source folder? Should include it as g++ included library? And how can I run test then?
Using Riga's excellent answer, here is a summary of how I got it to work:
Created a new C++ project in Eclipse (I chose Executable > Empty Project)
Downloaded googletest 1.5.0, untarred, and ran ./scripts/fuse_gtest_files.py . <project-dir>/contrib
Back in Eclipse, excluded the contrib directory from the Release build configuration, and added <project-dir>/contrib to the include directories (odd, I know)
Added a src directory and added a class named Foo (see below for the contents of Foo.h--I left Foo.cpp empty for now)
Added a test directory in Eclipse, excluded it from the Release build configuration, added <project-dir>/contrib to the include directories, and added new source files FooTest.cpp and AllTests.cpp (see below for contents)
Built and ran the project!
Foo.h:
#ifndef FOO_H_
#define FOO_H_
class Foo {
public:
virtual ~Foo();
Foo();
bool foo(void) { return true; }
};
#endif /* FOO_H_ */
FooTest.cpp:
#include "gtest/gtest.h"
#include "Foo.h"
namespace {
class FooTest : public ::testing::Test {
protected:
Foo foo;
};
TEST_F(FooTest, Foo) {
ASSERT_TRUE(foo.foo());
}
}
AllTests.cpp:
#include "gtest/gtest.h"
#include "FooTest.cpp"
int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
Here are the detailed steps:
In Eclipse, open the File menu and select New > C++ Project
Project Type: Executable > Empty Project
Toolchain: Linux GCC
Click Finish
Open a terminal and cd /tmp
wget http://googletest.googlecode.com/files/gtest-1.5.0.tar.bz2
cd gtest-1.5.0/
./scripts/fuse_gtest_files.py . <project-dir>/contrib
Back in Eclipse, right-click on the project folder in the Project Explorer pane, then select Refresh
In the Project Explorer pane, right-click on the contrib folder, select Exclude from build...*, untick only the **Release box, and click OK
Right-click on the contrib folder and select Properties > C/C++ Build > Settings > Tool Settings tab > GCC C++ Compiler > Directories
Click on the Add... button, then the Workspace... button, then select <project-name>/contrib and click OK to add the directory
Click OK once more to accept your changes to the build settings
Right-click on the project in the Project Explorer pane and select New > Folder, enter src as its name, and click OK
Right-click on the src folder in the Project Explorer pane and select New > Class, name it Foo, then click OK (see above for contents of Foo.h; Foo.cpp can be left as is)
Right-click on the project in the Project Explorer pane and select New > Folder, enter test as its name, and click OK
Follow the steps above to add <project-name>/contrib and <project-name>/src as include directories to the test directory
Right-click on the test folder, then select New > Source File to add AllTests.cpp to the test folder, then repeat the same steps to add FooTest.cpp (see above for contents)
Right-click on FooTest.cpp and select Exclude from build..., click the Select All button, then OK
Right-click on the project in the Project Explorer pane, and select Properties > C/C++ Build > Settings > Tool Settings tab > GCC C++ Linker > Libraries, then click the Add... button, enter pthread (required by googletest), click OK to add the library, then OK once more to accept the changes
Hit Ctrl-b to build the project
Hit Ctrl-F11 to run the project
Victory!
Step 1 Install Eclipse
If Eclipse is not already installed on the machine, then get the latest version of the Eclipse IDE for C/C++ Developers from the Eclipse downloads page (http://www.eclipse.org/downloads/).
If Eclipse is already installed but only for Java, download the C++ plug-in following these instructions.
a. Open Eclipse and click on Help->Install New Software
b. In the Work with: box, type in http://download.eclipse.org/tools/cdt/releases/kepler. After a few moments, the Name box will populate. Select the following components:
CDT Main Features -> C/C++ Development Tools
CDT Main Features -> C/C++ Development Tools SDK
CDT Optional Features -> C/C++ Unit Testing Support
CDT Optional Features -> C/C++ Unit Testing Support Source
CDT Optional Features -> C/C++ Visual C++ Support
c. Click on Next, agree to the statements, and then Finish.
Step 2 Download Cygwin
Install Cygwin by clicking on the setup-x86_64.exe link on the Cygwin install page (http://www.cygwin.com/install.html). After running, click Next through the defaults until you get to the Select Packages window.
You will need to search for and install two packages: gcc and make.
The first search term is gcc. Search for gcc and then open the Devel folder. Mark the following packages for install by clicking on the word Skip (it will then change to the build number, which may by higher than the one depicted here): gcc-core, gcc-g++, and libgcc1.
The second search term is make. Here, we will only need the Devel package make.
Once these have been selected, click Next to install.
Step 3 Download and build Google Test project
Download the latest release of GoogleTest from https://code.google.com/p/googletest/downloads/list, and extract the zip file contents into a common directory. It is important that all users are able to access this directory.
(Note: the following commands use make -- the last revision of GoogleTest that uses make is https://github.com/google/googletest/releases/tag/release-1.8.1. For future revisions of GoogleTest use cmake instead.)
To build the Google Test project:
Open Cygwin (find the install directory for Cygwin and double-click
on Cygwin.bat).
Change the current working directory to the unzipped
GoogleTest make directory: cd c:/<<yourpath>>/gtest-1.7.0/make/
Build the project: make
Create an archived library out of the
gtest-all.o file: ar -rv libgtest.a gtest-all.o
Step 4 Add the Cygwin bin directory to the computers PATH variable
Follow the instructions on this page for your version of Windows: http://www.java.com/en/download/help/path.xml, to add Cygwins bin directory to the computers PATH environment variable. (typically by adding ;C:\cygwin64\bin to the end of the current value).
Step 5 Create a new project that uses GoogleTest
Start Eclipse and select File->New->C++ Project. Enter the values below and click Finish.
In the Project Explore, right-click the name of the project and select Properties. Under C/C++ Build, change the Builder type to Internal Builder.
Under C/C++ Build, select Settings, then click on the Includes folder under Cygwin C++ Compiler. Click on the Add button in the top box and then browse to the GoogleTest include folder.
Lastly, under the Cygwin C++ Linker folder, select Miscellaneous and then click the Add icon under Other objects. Find the libgtest.a file that you built back in step 3 (it should be in the make directory of the unzipped gtest folder).
Thats it! Now you're ready to try it out.
Step 6 Write some code that uses GoogleTest
Add a source folder by clicking File->New->Source folder. Call it
src.
Add a header file by right-clicking on the src folder and select New->Header File. Call this file Counter.h.
Add a source file by right-clicking on the src folder and select New->Source File. Call
this file Counter.cpp.
Add another source file and call it Counter_Tests.cpp.
Copy and paste the code below into the appropriate files:
Counter.h
class Counter {
private:
int mCounter;
public:
Counter() : mCounter(0) {}
int Increment();
};
Counter.cpp
#include <stdio.h>
#include "Counter.h"
int Counter::Increment() {
return mCounter++;
}
Counter_Tests.cpp
#include "gtest/gtest.h"
#include "Counter.h"
TEST(Counter, Increment) {
Counter c;
EXPECT_EQ(0, c.Increment());
EXPECT_EQ(1, c.Increment());
EXPECT_EQ(2, c.Increment());
}
int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
In the Project menu select Build All. Now, to connect up the GoogleTest unit testing framework, select Run Configurations from the Run menu. From this dialog, select C/C++ Unit and click the New button.
It should fill in this project name automatically under C/C++ Application, if not click on Search Project to select this project. Next, click on the C/C++ Testing tab. In the Tests Runner drop-down, choose Google Tests Runner, and then click Run to watch the magic!
Below is a snapshot of the result. After writing more code/tests, you can click on the button highlighted in red to quickly recompile and re-run all of the tests.
You should not add it to your source folder, make separate folder instead. This is for avoidance of dependency of your production code from testing project. Do it like this
../ #your project folder
Makefile
src/
module1 #some module
module2 #another module
build #tmp for build
dist #binaries
contrib/
gtest
...
test/ #your test project folder
Makefile
src/
module1 #correspondent to main project's one
module2 #correspondent to main project's one
build
dist
...
I usually use google test as two files, this is very handy. Use scripts/fuse_gtest_files.py from gtest distribution to extract them. Having only two files you can include their compilation in your test project compilation and have simple project structure.
In your test projectspecify include directories ../contrib:../src:src.
Thus you can include headers like this
test/src/module1/class1Test.h:
#include "gtest/gtest.h"
#include "module1/class1.h"
// test class1 here
// ...
test/src/mainTest.cpp:
#include "gtest/gtest.h"
#include "module1/class1Test.h"
#include "module2/class2Test.h"
// include other tests you have
// ...
int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
Here is my solution for Eclipse 4.3 and CDT 8.2
I felt this was somewhat easier then described above.
Download gtest and install it as described in the readme.txt (using cmake and make in linux)
Go to "YourProject-> Properties-> C/C++ Build-> Settings-> GCC C++ Compiler-> Includes-> Include paths" and add the include folder in gtest
Go to "YourProject-> Properties-> C/C++ Build-> Settings-> GCC C++ Linker-> Libraries", add the gtest folder as search path and add libraries "gtest" and "pthread"
(4. If you have tests in the same project as sources exclude tests from release build)
Go to "Run-> Run Configurations..." and Create a new C/C++ Unit run configuration
Set project to your project and C/C++ Application to your Application in main tab. Set Tests Runner to Google Test Runner in C/C++ Testing tab.
(7. Error notifications may stick around in the eclipse gui, if this is the case re-indexing the project might help)
I've tray your solution and it runs well. I can say that for compile gtest is not very clear in the README. txt.
I've run the makefile in the /make directory through a cygwin console.
In my case the compiler advise me that don't findt the pthread library. So I modified the line
CXXFLAGS += -g -Wall -Wextra -pthread
and changed it to
CXXFLAGS += -g -Wall -Wextra -lpthread
The output I get is gtest_main.a. Then I have rename this file into libgtest.a and copy it to C:\cygwin\lib directory.
Then i've configure my eclipse project to use cygwin and added gtest and pthread as you say... and it works!
I hope it can help someone