LinuxQuestions.org
Visit Jeremy's Blog.
Home Forums Tutorials Articles Register
Go Back   LinuxQuestions.org > Forums > Non-*NIX Forums > Programming
User Name
Password
Programming This forum is for all programming questions.
The question does not have to be directly related to Linux and any language is fair game.

Notices


Reply
  Search this Thread
Old 06-01-2009, 10:30 PM   #1
billymayday
LQ Guru
 
Registered: Mar 2006
Location: Sydney, Australia
Distribution: Fedora, CentOS, OpenSuse, Slack, Gentoo, Debian, Arch, PCBSD
Posts: 6,678

Rep: Reputation: 122Reputation: 122
Can you create a Windows DLL under Linux


Does anyone know if I can write (and compile) a DLL for use with Windows Office 2007 under Linux?

I suspect the answer is no, but I thought I'd ask before I ran out and bought Visual C++

BM
 
Old 06-01-2009, 10:59 PM   #2
paulsm4
LQ Guru
 
Registered: Mar 2004
Distribution: SusE 8.2
Posts: 5,863
Blog Entries: 1

Rep: Reputation: Disabled
Hi -

The short answer, of course, is "No".

But I'm curious why you (somebody with "guru" status, no less!) would ask a question like this. In particular, I'm curious:

a) If you're writing something for use with Office 2007... then I presume you have access to Windows. So why would you want to use Linux for this particular task in the first place?

b) I presume you're writing some kind of plug-in or add-on to MS Office. Then again, maybe you're writing something that invokes MS Office (and uses Word functionality as a "service"). Either way, why does it need to be a .dll? As opposed to an .exe? Or even better, a script or macro of some kind?

In short: What's the goal? What are your constraints? And what are your preferences? Knowing these would help us answer the question more intelligently.

Thanx in advance .. PSM

PS:
Even if you decide to go with MSVS - you don't actually have to buy anything if you don't want to. You can always download VS2008 Express:

http://www.microsoft.com/Express/

Last edited by paulsm4; 06-01-2009 at 11:01 PM.
 
Old 06-01-2009, 11:07 PM   #3
billymayday
LQ Guru
 
Registered: Mar 2006
Location: Sydney, Australia
Distribution: Fedora, CentOS, OpenSuse, Slack, Gentoo, Debian, Arch, PCBSD
Posts: 6,678

Original Poster
Rep: Reputation: 122Reputation: 122
I don't see why it's so out there. It's quite possible to cross compile across many systems as I recall. I found various references to Windows APIs for Linux around the place, but nothing on DLLs per se.

The answer to (a) is because I will have to buy Visual C++ to do it is the short answer (notwithstanding your ps). It's some years since I wrote a DLL, so I'm ultra rusty on this one.

The answer to (b) is I'm writing a custom function (or set of functions) for Excel. Converting from VBA because it's too slow.

As I said, I suspected I knew the answer, but just in case I thought I'd ask.

Does VS include C++? I spent 1/2hr digging around on the Windows site and came out knowing about the same as when I went in. I did see the VS2008 Express download, but it really doesn't tell you a lot about what it includes.

Last edited by billymayday; 06-01-2009 at 11:09 PM.
 
Old 06-01-2009, 11:25 PM   #4
paulsm4
LQ Guru
 
Registered: Mar 2004
Distribution: SusE 8.2
Posts: 5,863
Blog Entries: 1

Rep: Reputation: Disabled
Yes, MSVS still supports C++ (although Microsoft obviously wishes everybody would get on the .Net bandwagon, forget their old VB6 and C++/Win32 ways, and just program everything in C# or VB.Net and run it on the CLR):

http://www.microsoft.com/Express/vc/

Strong suggestion: make friends with "ATL". I think you're going to need COM/ActiveX, and ATL will make your life *much* easier:

http://msdn.microsoft.com/en-us/libr...7x(VS.71).aspx

'Hope that helps .. PSM
 
Old 06-02-2009, 04:06 AM   #5
Sergei Steshenko
Senior Member
 
Registered: May 2005
Posts: 4,481

Rep: Reputation: 454Reputation: 454Reputation: 454Reputation: 454Reputation: 454
Quote:
Originally Posted by paulsm4 View Post
Hi -

The short answer, of course, is "No".
...
The short answer, of course, is "Yes".

I have been playing recently with cross-compilation and, specifically, with cross-libtool.

And during my games I have created DLLs, and they can be loaded both under WINE and under Win2k.

Interesting enough, one can even use .so extension under Windows too, though by default the extension is, of course, .dll.

The beauty of (cross)libtool is that one can write programs in a portable way - the tool takes care of all the tricky details.
 
Old 06-02-2009, 04:12 AM   #6
billymayday
LQ Guru
 
Registered: Mar 2006
Location: Sydney, Australia
Distribution: Fedora, CentOS, OpenSuse, Slack, Gentoo, Debian, Arch, PCBSD
Posts: 6,678

Original Poster
Rep: Reputation: 122Reputation: 122
Thanks Sergei, I feel at least partially vindicated. Could you suggest any useful links by any chance?

Paul, I having a chat with MS tomorrow to find out more about their offerings. I note the Express version lacks some libraries, so I'll have to find out if that relates to DLLs or not.

Appreciate the help.
 
Old 06-02-2009, 05:26 AM   #7
Sergei Steshenko
Senior Member
 
Registered: May 2005
Posts: 4,481

Rep: Reputation: 454Reputation: 454Reputation: 454Reputation: 454Reputation: 454
Quote:
Originally Posted by billymayday View Post
Thanks Sergei, I feel at least partially vindicated. Could you suggest any useful links by any chance?
...
Start from two things:
  1. build cross-compiler, for that go to http://www.profv.de/mingw_cross_env/ -> http://www.profv.de/mingw_cross_env/README.html -> http://www.profv.de/mingw_cross_env/...env-2.5.tar.gz
  2. build first native GNU libtool in order to gain practice - go to http://www.gnu.org/software/libtool/
.

Cross-compiler build may fail with an error message about wrong checksum/md5sum - if so, let me know, I'll explain in detail what the problem is and how to fix it - it's not a problem in 'mingw_cross_env-2.5.tar.gz', but in a native MinGW tarball. And originally there were no problems, i.e. the problem appeared due to a change in the MinGW tarball which shouldn't have happened.

When you're done with the first two steps and when you gain traction with 'libtool' in native environment, I'll guide you further.

Cross-compiler build takes time; choose to build just the gcc core. You may build native 'libtool' while cross compiler is being built - native 'libtool' is independent from cross-gcc.
 
Old 06-02-2009, 05:34 AM   #8
billymayday
LQ Guru
 
Registered: Mar 2006
Location: Sydney, Australia
Distribution: Fedora, CentOS, OpenSuse, Slack, Gentoo, Debian, Arch, PCBSD
Posts: 6,678

Original Poster
Rep: Reputation: 122Reputation: 122
Thanks. I'll wait to see what MS come back with before I try this, but it's great to know.

Rgds
 
Old 06-02-2009, 05:41 AM   #9
Sergei Steshenko
Senior Member
 
Registered: May 2005
Posts: 4,481

Rep: Reputation: 454Reputation: 454Reputation: 454Reputation: 454Reputation: 454
billymayday, I've thought about my previous post and I want to make one thing clear. I've been searching WEB a lot, and I haven't found one ready-made recipe - this thread may become one. I.e. the rest of the info I'm going to publish is what I more or less guessed (and it worked for me), that's why I'm not giving you further links - I simply do not have them.
 
Old 06-02-2009, 05:52 AM   #10
billymayday
LQ Guru
 
Registered: Mar 2006
Location: Sydney, Australia
Distribution: Fedora, CentOS, OpenSuse, Slack, Gentoo, Debian, Arch, PCBSD
Posts: 6,678

Original Poster
Rep: Reputation: 122Reputation: 122
Actually, I couldn't resist trying.

I get
Quote:
if ! [ '36ef40de84cb8778e68f883d1cf320d9e627342d' == "`openssl sha1 '/home/bill/src/mingw_cross_env-2.5/pkg/mingwrt-3.15.2-mingw32-dev.tar.gz' | sed -n 's,^.*\([0-9a-f]\{40\}\)$,\1,p'`" ]; then wget -c -O '/home/bill/src/mingw_cross_env-2.5/pkg/mingwrt-3.15.2-mingw32-dev.tar.gz' 'http://kent.dl.sourceforge.net/mingw/mingwrt-3.15.2-mingw32-dev.tar.gz'; [ '36ef40de84cb8778e68f883d1cf320d9e627342d' == "`openssl sha1 '/home/bill/src/mingw_cross_env-2.5/pkg/mingwrt-3.15.2-mingw32-dev.tar.gz' | sed -n 's,^.*\([0-9a-f]\{40\}\)$,\1,p'`" ] || { echo 'Wrong checksum!'; exit 1; }; fi
--20:50:26-- http://kent.dl.sourceforge.net/mingw...w32-dev.tar.gz
Resolving kent.dl.sourceforge.net... 212.219.56.167
Connecting to kent.dl.sourceforge.net|212.219.56.167|:80... connected.
HTTP request sent, awaiting response... 416 Requested Range Not Satisfiable

The file is already fully retrieved; nothing to do.

Wrong checksum!
make: *** [/home/bill/src/mingw_cross_env-2.5/usr/installed-mingwrt] Error 1
from "make gcc libtool". I assume this is the error you referred to.
 
Old 06-02-2009, 05:58 AM   #11
Sergei Steshenko
Senior Member
 
Registered: May 2005
Posts: 4,481

Rep: Reputation: 454Reputation: 454Reputation: 454Reputation: 454Reputation: 454
Quote:
Originally Posted by billymayday View Post
Thanks. I'll wait to see what MS come back with before I try this, but it's great to know.

Rgds
Meanwhile below you may find a screen session (have just prepared it) which shows the following:
  1. source of library.c which eventually becomes library.dll;
  2. cross-compilation of library.c;
  3. cross-linking of library.c;
  4. source of main.c which eventually becomes main.exe;
  5. cross-compilation of main.c;
  6. cross-linking of main.c;
  7. stripping of main.c;
  8. running of main.exe under WINE.

Code:
sergei@amdam2:~/try_ltdl> cat -n library.c
     1  unsigned lib_function(double input)
     2    {
     3    return (unsigned)input;
     4    }
     5
     6  /*
     7
     8  gcc -Wall -Wextra -O2 -fPIC -DPIC -g -c library.c
     9  gcc -shared library.o -Wl,-soname -o library.so
    10
    11  For Windows:
    12
    13  /mnt/sdb8/sergei/AFSWD_debug/install/libtool-i686-mingw32msvc-2.2.6a/bin/libtool --mode=compile --tag=CC /home/sergei/mingwi686/bin/i686-mingw32msvc-gcc -export-dynamic -O2 -Wall -Wextra -shared -no-suppress -c library.c -o library.lo
    14  (export PATH=~/mingwi686/bin:$PATH; /mnt/sdb8/sergei/AFSWD_debug/install/libtool-i686-mingw32msvc-2.2.6a/bin/libtool --mode=link --tag=CC /home/sergei/mingwi686/bin/i686-mingw32msvc-gcc -O2 -no-undefined -avoid-version -Wall -Wextra -shared library.lo -rpath `pwd` -o library.la)
    15
    16
    17  */
sergei@amdam2:~/try_ltdl> /mnt/sdb8/sergei/AFSWD_debug/install/libtool-i686-mingw32msvc-2.2.6a/bin/libtool --mode=compile --tag=CC /home/sergei/mingwi686/bin/i686-mingw32msvc-gcc -export-dynamic -O2 -Wall -Wextra -shared -no-suppress -c library.c -o library.lo
libtool: compile:  /home/sergei/mingwi686/bin/i686-mingw32msvc-gcc -export-dynamic -O2 -Wall -Wextra -c library.c  -DDLL_EXPORT -DPIC -o .libs/library.o
sergei@amdam2:~/try_ltdl> (export PATH=~/mingwi686/bin:$PATH; /mnt/sdb8/sergei/AFSWD_debug/install/libtool-i686-mingw32msvc-2.2.6a/bin/libtool --mode=link --tag=CC /home/sergei/mingwi686/bin/i686-mingw32msvc-gcc -O2 -no-undefined -avoid-version -Wall -Wextra -shared library.lo -rpath `pwd` -o library.la)
libtool: link: rm -fr  .libs/library.dll .libs/library.dll.a .libs/library.la .libs/library.lai
libtool: link: /home/sergei/mingwi686/bin/i686-mingw32msvc-gcc -shared  .libs/library.o      -o .libs/library.dll -Wl,--enable-auto-image-base -Xlinker --out-implib -Xlinker .libs/library.dll.a
Creating library file: .libs/library.dll.a
libtool: link: ( cd ".libs" && rm -f "library.la" && ln -s "../library.la" "library.la" )
sergei@amdam2:~/try_ltdl> cat -n main.c
     1  #include <stdio.h>
     2  #include <stdlib.h>
     3
     4  #include <ltdl.h>
     5
     6  int main()
     7    {
     8    fprintf(stderr, "CHECKPOINT 1\n");
     9
    10    lt_dlhandle handle;
    11
    12    const char *lib_file_to_open = "./library.dll";
    13
    14    if(0 != lt_dlinit())
    15      {
    16      fprintf(stderr, ":ERROR: failure executing 'lt_dlinit()', the error message was: %s\n", lt_dlerror());
    17      exit(EXIT_FAILURE);
    18      }
    19
    20    fprintf(stderr, "CHECKPOINT 2\n");
    21
    22    handle = lt_dlopen(lib_file_to_open);
    23
    24    fprintf(stderr, "CHECKPOINT 3\n");
    25    if(!handle)
    26      {
    27      fprintf(stderr, ":ERROR: could not open '%s' file, the error message: %s\n", lib_file_to_open, lt_dlerror());
    28      exit(EXIT_FAILURE);
    29      }
    30
    31    fprintf(stderr, "CHECKPOINT 4\n");
    32
    33    unsigned (*lib_function)(double input);
    34    *(void **) (&lib_function) = lt_dlsym(handle, "lib_function");
    35
    36    if(NULL == lib_function)
    37      {
    38      fprintf(stderr, ":ERROR: couldn't perform lookup of 'lib_function' symbol, the error message: %s\n", lt_dlerror());
    39      exit(EXIT_FAILURE);
    40      }
    41
    42    fprintf(stderr, "result: %d\n", (*lib_function)(2.34));
    43
    44    if(lt_dlexit())
    45      {
    46      fprintf(stderr, ":ERROR: failure executing 'lt_dlexit()', the error message: %s\\n", lt_dlerror());
    47      exit(EXIT_FAILURE);
    48      }
    49
    50
    51    exit(EXIT_SUCCESS);
    52    }
    53
    54
    55
    56  /*
    57
    58  (export PATH=/home/sergei/mingwi686/bin:$PATH;BUILD_SCRIPT=/home/sergei/AppsFromScratch/20081216/bin/build.pl; export PKG_CONFIG_PATH=/usr/lib/pkgconfig;$BUILD_SCRIPT -make_like -check_with_ldd -targets_to_build bash:pkg-config 1>build.prerequisites.log 2>&1; PATH=`pwd`/install/pkg-config-0.23/bin:$PATH; export PATH; $BUILD_SCRIPT -make_like -check_with_ldd -sh_exec `pwd`/install/bash-4.0/bin/bash -targets_to_build libtool-i686-mingw32msvc 1>rebuild.log 2>&1) &
    59
    60  */
    61
    62  /*
    63
    64  Cross-compiling and linking for Windows:
    65
    66  1)
    67  /mnt/sdb8/sergei/AFSWD_debug/install/libtool-i686-mingw32msvc-2.2.6a/bin/libtool \
    68  --mode=compile --tag=CC \
    69  /home/sergei/mingwi686/bin/i686-mingw32msvc-gcc \
    70  -I/mnt/sdb8/sergei/AFSWD_debug/install/libtool-i686-mingw32msvc-2.2.6a/include \
    71  -O2 -Wall -Wextra -shared -no-suppress \
    72  -c main.c \
    73  -o main.lo
    74
    75  2)
    76  (\
    77  export PATH=~/mingwi686/bin:$PATH;\
    78  /mnt/sdb8/sergei/AFSWD_debug/install/libtool-i686-mingw32msvc-2.2.6a/bin/libtool \
    79  --mode=link --tag=CC \
    80  /home/sergei/mingwi686/bin/i686-mingw32msvc-gcc \
    81  -export-dynamic -no-undefined -O2 \
    82  main.lo library.lo \
    83  -o main.exe \
    84  -static-libtool-libs \
    85  /mnt/sdb8/sergei/AFSWD_debug/install/libtool-i686-mingw32msvc-2.2.6a/lib/libltdl.la\
    86  )
    87
    88  3)
    89  /home/sergei/mingwi686/bin/i686-mingw32msvc-strip main.exe
    90
    91
    92  */
sergei@amdam2:~/try_ltdl> /mnt/sdb8/sergei/AFSWD_debug/install/libtool-i686-mingw32msvc-2.2.6a/bin/libtool \
> --mode=compile --tag=CC \
> /home/sergei/mingwi686/bin/i686-mingw32msvc-gcc \
> -I/mnt/sdb8/sergei/AFSWD_debug/install/libtool-i686-mingw32msvc-2.2.6a/include \
> -O2 -Wall -Wextra -shared -no-suppress \
> -c main.c \
> -o main.lo
libtool: compile:  /home/sergei/mingwi686/bin/i686-mingw32msvc-gcc -I/mnt/sdb8/sergei/AFSWD_debug/install/libtool-i686-mingw32msvc-2.2.6a/include -O2 -Wall -Wextra -c main.c  -DDLL_EXPORT -DPIC -o .libs/main.o
main.c: In function 'main':
main.c:34: warning: dereferencing type-punned pointer will break strict-aliasing rules
sergei@amdam2:~/try_ltdl> (\
> export PATH=~/mingwi686/bin:$PATH;\
> /mnt/sdb8/sergei/AFSWD_debug/install/libtool-i686-mingw32msvc-2.2.6a/bin/libtool \
> --mode=link --tag=CC \
> /home/sergei/mingwi686/bin/i686-mingw32msvc-gcc \
> -export-dynamic -no-undefined -O2 \
> main.lo library.lo \
> -o main.exe \
> -static-libtool-libs \
> /mnt/sdb8/sergei/AFSWD_debug/install/libtool-i686-mingw32msvc-2.2.6a/lib/libltdl.la\
> )
libtool: link: /home/sergei/mingwi686/bin/i686-mingw32msvc-gcc -O2 .libs/main.o .libs/library.o -o main.exe -Wl,--export-dynamic  /mnt/sdb8/sergei/AFSWD_debug/install/libtool-i686-mingw32msvc-2.2.6a/lib/libltdl.a -L/mnt/sdb8/sergei/AFSWD_debug/install/ncurses-5.7/lib
sergei@amdam2:~/try_ltdl> /home/sergei/mingwi686/bin/i686-mingw32msvc-strip main.exe
sergei@amdam2:~/try_ltdl> /mnt/sdb8/sergei/AFSWD_debug/install/wine-1.1.13/binsh/wine main.exe
CHECKPOINT 1
CHECKPOINT 2
CHECKPOINT 3
CHECKPOINT 4
result: 2
sergei@amdam2:~/try_ltdl>
 
Old 06-02-2009, 06:07 AM   #12
Sergei Steshenko
Senior Member
 
Registered: May 2005
Posts: 4,481

Rep: Reputation: 454Reputation: 454Reputation: 454Reputation: 454Reputation: 454
Quote:
Originally Posted by billymayday View Post
Actually, I couldn't resist trying.

I get


from "make gcc libtool". I assume this is the error you referred to.
So, the problem is that the original mingwrt-3.15.2-mingw32-dev.tar.gz got modified by apparently non-cross MinGW developers, they added bin/mingwm10.dll file, but didn't change the md5sum.

The file has a "wrong" size now, which is 565306, it should be 562075.

According to 'diff -rq ....' it's the only difference.

Under your CWD there should be 'pkg' directory, ans there you should see all already downloaded tarballs - in my case:

Code:
pwd; ls -ltr
/home/sergei/junk/mingw_cross_env-2.5/pkg
total 73536
-rw-r--r-- 1 sergei users 11640890 2007-11-07 23:44 gettext-0.17.tar.gz
-rw-r--r-- 1 sergei users  4513309 2007-11-11 20:24 libiconv-1.12.tar.gz
-rw-r--r-- 1 sergei users  1032839 2008-01-17 00:54 pkg-config-0.23.tar.gz
-rw-r--r-- 1 sergei users   986373 2008-11-26 02:00 mpfr-2.3.2.tar.bz2
-rw-r--r-- 1 sergei users  1710660 2008-11-26 02:00 gmp-4.2.4.tar.bz2
-rw-r--r-- 1 sergei users  1634605 2008-12-06 04:38 w32api-3.13-mingw32-dev.tar.gz
-rw-r--r-- 1 sergei users   562075 2009-01-10 23:53 mingwrt-3.15.2-mingw32-dev.tar.gz
-rw-r--r-- 1 sergei users 24355225 2009-02-10 23:47 gcc-core-4.3.3.tar.bz2
-rw-r--r-- 1 sergei users  1212708 2009-02-10 23:47 gcc-fortran-4.3.3.tar.bz2
-rw-r--r-- 1 sergei users  5638200 2009-02-10 23:47 gcc-g++-4.3.3.tar.bz2
-rw-r--r-- 1 sergei users   230061 2009-02-10 23:48 gcc-objc-4.3.3.tar.bz2
-rw-r--r-- 1 sergei users    23901 2009-02-16 03:11 gcc-4.3.3-tdm-1-srcbase.zip
-rw-r--r-- 1 sergei users 21601735 2009-03-12 16:02 binutils-2.19.1-src.tar.gz
sergei@amdam2:~/junk/mingw_cross_env-2.5/pkg>
So, unpack mingwrt-3.15.2-mingw32-dev.tar.gz, remove the

bin/mingwm10.dll

including directory - there is no 'bin' directory in the correct taraball, and repack it back.

If this doesn't help, tell me (through PM if you wish) where (to what Email) to send the correct tarball.
 
Old 06-02-2009, 06:55 AM   #13
billymayday
LQ Guru
 
Registered: Mar 2006
Location: Sydney, Australia
Distribution: Fedora, CentOS, OpenSuse, Slack, Gentoo, Debian, Arch, PCBSD
Posts: 6,678

Original Poster
Rep: Reputation: 122Reputation: 122
I'll have a go tomorrow.


Thanks
 
Old 06-02-2009, 07:20 AM   #14
Sergei Steshenko
Senior Member
 
Registered: May 2005
Posts: 4,481

Rep: Reputation: 454Reputation: 454Reputation: 454Reputation: 454Reputation: 454
Quote:
Originally Posted by billymayday View Post
I'll have a go tomorrow.


Thanks

When you're back try to get the correct file from here:

http://sergei-steshenko.pop3.ru/flas...w32-dev.tar.gz
.


The correct sha1sum is 36ef40de84cb8778e68f883d1cf320d9e627342d; I have verified after uploading/downloading that the file has this sha1sum.

The trick with removing the extra file and repackaging most likely won't work.
 
Old 06-02-2009, 10:15 AM   #15
paulsm4
LQ Guru
 
Registered: Mar 2004
Distribution: SusE 8.2
Posts: 5,863
Blog Entries: 1

Rep: Reputation: Disabled
Sergei Steshenko -

Just because you *can* eat string beans through your nose ... doesn't necessarily mean that you *should*.

"Mingw" is emphatically *not* the first choice for a job like this. I'd consider lots of other alternatives - including OpenWatcom - before I'd go there. And I would certainly *not* cross-compile on Linux for a target on Windows (if, in fact, that's what you're suggesting). Any more than I'd cross compile a Linux target on a Windows compiler... "Native" is almost always preferable - and MS Visual Studio for an MS product on an MS platform is, for better or worse, a win.

IMHO .. PSM
 
  


Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off



Similar Threads
Thread Thread Starter Forum Replies Last Post
Build DLL in Linux and use it on Windows kolikko Programming 5 10-23-2008 02:41 PM
porting a windows dll into linux so file bianchi Programming 1 12-20-2005 02:58 PM
How to create .dll in linux like in windows to support client access? samples needed heather27j Linux - Software 1 11-16-2004 04:06 PM
Windows DLL to Linux .so mohan_mohan Linux - Software 3 11-04-2004 10:43 AM
Can I access a Windows DLL directly from Linux code? Silverjam Linux - Software 3 07-10-2004 09:46 PM

LinuxQuestions.org > Forums > Non-*NIX Forums > Programming

All times are GMT -5. The time now is 07:09 AM.

Main Menu
Advertisement
My LQ
Write for LQ
LinuxQuestions.org is looking for people interested in writing Editorials, Articles, Reviews, and more. If you'd like to contribute content, let us know.
Main Menu
Syndicate
RSS1  Latest Threads
RSS1  LQ News
Twitter: @linuxquestions
Open Source Consulting | Domain Registration