For the past few days, I’ve been working on a small Protobuf Compiler plugin. During the course of development, I was stuck on a trivial yet annoying problem – path expansion.
This trivial problem led me to a wild goose chase. From branch diff’ing to debugging, it took me several days to figure this out.
Long Story Short
Here’s a small program called wildcard_input.
#include int main(int argc, char **argv) { for(int i=0; i<argc; ++i) { std::cout << argv[i] << std::endl; } return 0; }
Now I invoke the following command.
wildcard_input *
This is the output from Win7 and Ubuntu 12.4.

Running from Ubuntu 12.04
Apparently path expansion is performed through the shell by default under Linux, whereas it is left to the program to handle under Windows. I prefer the Linux behavior, but others might disagree.
Windows Path Expansion
To get the automatic path expansion behavior in Windows, you need to add a linker options – /link setargv.obj in Visual Studio.
With this option, wildcard paths are now expanded properly.
Retrospection
- Filed misleading bug to the Protobuf team.
- Diff’ed 4 different branches for code delta
- Hours of proto compiler debugging and Stackoverflow browsing.
… Alan